首页 > 编程语言 >python笔记:第十一章正则表达式

python笔记:第十一章正则表达式

时间:2023-07-19 20:34:48浏览次数:39  
标签:匹配 re python 第十一章 正则表达式 print group findall

1.模块re

  • 以一定规则,快速检索文本,或是实现一些替换操作
  • 默认下,区分大小写

2.常见的匹配字符表

字符 描述
\d 代表任意数字,就是阿拉伯数字 0-9 这些
\D 代表非数字的字符。与\d完全相反
\w 代表字母,数字,下划线。也就是 a-z、A-Z、0-9、_
\W 跟 \w 相反 ,代表不是字母,不是数字,不是下划线的字符。
\n 代表一个换行。
\r 代表一个回车。
\f 代表换页。
\t 代表一个 Tab 。
\s 代表所有的空白字符,也就是上面这四个:\n、\r、\t、\f。
\S 跟 \s 相反,代表所有不是空白的字符。
\A 代表字符串的开始。
\Z 代表字符串的结束。
^ 匹配字符串开始的位置。
$ 匹配字符创结束的位置。
. 代表所有的单个字符,除了 \n \r
[...] 代表在 [] 范围内的字符,比如 [a-z] 就代表 a到z的字母
[^...] 跟 [...] 唱反调,代表不在 [] 范围内的字符
匹配在 {n} 前面的东西,比如: o{2} 不能匹配 Bob 中的 o ,但是能匹配 food 中的两个o。
{n,m} 匹配在 {n,m} 前面的东西,比如:o{1,3} 将匹配fooooood中的前三个o。
{n,} 匹配在 {n,} 前面的东西,比如:o{2,} 不能匹配“Bob”中的“o”,但能匹配fooooood中的所有o。
* 和 {0,} 一个样,匹配 * 前面的 0 次或多次。 比如 zo* 能匹配“z”、“zo”以及“zoo”。
+ 和{1,} 一个样,匹配 + 前面 1 次或多次。 比如 zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。
和{0,1} 一个样,匹配 ?前面 0 次或 1 次。
a|b 匹配 a 或者 b。
() 匹配括号里面的内容。
a = 'C|C++|C#|Python|Java'
# 判断字符串 a 中是否含有 Python
print(a.index('Python')>-1)   #  True
print('Python' in a)   #  True

import re

re.findall('Python', a)  #  在字符串 a 中,找到所有的'Python'字符串
print(re.findall("Python", a))  #  ['Python']

2.1/d /D

import re
a = 'C0C++1C#2Python3Java'
# 检索所有数字
r = re.findall('\d', a)  #  \d 匹配所有数字  元字符的一种
print(r)  # ['0', '1', '2', '3']

r = re.findall('\D', a)  #  \d 匹配所有非数字  元字符的一种
print(r)  # ['0', '1', '2', '3']
# ['C', 'C', '+', '+', 'C', '#', 'P', 'y', 't', 'h', 'o', 'n', 'J', 'a', 'v', 'a']

2.2[] 表示或

#  []  表示或
import re
s = 'abc, acc, adc, aec, afc, ahc'
r = re.findall('a[cf]c', s) # 匹配中间是 c 或 f 的字符串
print(r)  # ['acc', 'afc']

# [^]   表示否定
r = re.findall('a[^cf]c', s) # 匹配中间不是 c 和 f 的字符串
print(r)  # ['abc', 'adc', 'aec', 'ahc']

#  [c-f]   匹配c 到 f 的所有字符
r = re.findall('a[c-f]c', s) # 匹配 c 到 f 的字符
print(r)  # ['acc', 'adc', 'aec', 'afc']

2.3\w \W

# 概括字符集
# \w   \W
import re
a = 'C0C++\n1C# 2Python3*Java_'

r = re.findall('\w', a) # 匹配数字和字母  相当于  [A-Za-z0-9_]
print(r)  
# ['C', '0', 'C', '1', 'C', '2', 'P', 'y', 't', 'h', 'o', 'n', '3', 'J', 'a', 'v', 'a', '_']

r = re.findall('\W', a)  # 非单词字符  
print(r)  #  ['+', '+', '\n', '#', ' ', '*']

# \s  空白字符
r = re.findall('\s', a) 
print(r)  # ['\n', ' ']

2.4{} 表示匹配次数

# 数量词  
#  {4}   4 表示每次匹配次数 
import re
a = 'python 11 java 22 php'
r = re.findall('[a-z]{3}', a)
print(r)  # ['pyt', 'hon', 'jav', 'php']

# {3, 6}  表示匹配次数在 3到6 之间
r = re.findall('[a-z]{3,6}', a)
print(r)  # ['python', 'java', 'php']

2.5贪婪 非贪婪

# 贪婪 非贪婪 
# python 默认为贪婪模式  尽可能 多匹配 和 多次匹配
# 非贪婪模式  表达式后面加 ? 匹配最少的次数
r = re.findall('[a-z]{3,6}?', a)
print(r)  # ['pyt', 'hon', 'jav', 'php']

2.6* +

# * 匹配 0 次或者无限多次
a = 'pytho0python1pythonn2'
r = re.findall('python*', a) # 与 * 紧挨的字符n 匹配0次或是无限多次
print(r) # ['pytho', 'python', 'pythonn']

r = re.findall('pytho*', a) # 与 * 紧挨的字符n 匹配0次或是无限多次
print(r) # ['pytho', 'pytho', 'pytho']

r = re.findall('pythonn*', a) # 与 * 紧挨的字符n 匹配0次或是无限多次
print(r) # ['python', 'pythonn']

# + 匹配一次或无限多次
import re
r = re.findall('python+', a) # 与 * 紧挨的字符n 匹配1次或是无限多次
print(r) # ['python', 'pythonn']

# 不加 ?  
r = re.findall('python{1,2}', a) # 匹配n 出现一次到两次
print(r) # ['python', 'pythonn']

# 加了 ?  
r = re.findall('python{1,2}?', a) # 匹配n 出现一次
print(r) # ['python', 'python']

2.7^ $ 边界符

# 边界匹配
import re
qq = '1000001'

r = re.findall('\d{4,8}', qq) # 匹配4 到8 位的QQ号
print(r)  # ['1000001']

qq = '10000000001'
r = re.findall('\d{4,8}', qq) # 匹配4 到8 位的QQ号
print(r)  # ['1000001']     没有达到目的

# ^ $ 边界符  
# ^ 规定以什么开始
# $ 规定以什么结束
r = re.findall('^\d{4,8}$', qq) # 匹配4 到8 位的QQ号
print(r)  # []   没有匹配到

r = re.findall('^0000', qq) # 匹配从 0 开始的字符串
print(r)  # []   没有匹配到

2.8() 分组

# ()  一个括号对应一组
import re
a = 'pythonpythonpythonJs'

r = re.findall('(python){3}(JS)', a)
print(r)  # []

# re.I 不区分大小写  第三个参数
r = re.findall('(python)(JS)', a, re.I)
print(r)  # [('python', 'Js')]

# 接受多个第三个参数时,用|隔开
r = re.findall('(python)(JS)', a, re.I | re.S)
print(r)  # [('python', 'Js')]

2.9. 匹配除换行符\n 以外的其他所有字符

# . 匹配出换行符\n 以外的其他所有字符
a = 'python\nCC'
r = re.findall('python.', a, re.I)
print(r)  # []   无法匹配\n

r = re.findall('python.', a, re.S)   #  让 . 可以匹配换行符 
print(r)  # ['python\n']   

2.10re.sub 替换操作

# re.sub 替换操作
import re
language = 'PythonC#JavaC#PHPC#'
r = re.sub('C#', 'GO', language)
print(r)   # PythonGOJavaGOPHPGO

r = re.sub('C#', 'GO', language, 1)
print(r)   # PythonGOJavaC#PHPC#   只替换了一个

r = re.sub('C#', 'GO', language, 0)
print(r)   # PythonGOJavaGOPHPGO

# re.sub 的第二个参数可以是函数
def convert(value):
    pass
r = re.sub('C#', convert, language)
print(r)  # PythonJavaPHP


def conver(value):
    matched = value.group()
    return '!!' + matched + '!!'

r = re.sub('C#', convert, language)
print(r)   # Python!!C#!!PHP!!C#!!

2.11将函数作为参数

# 将函数作为参数
import re
s = 'ABC37978D432'

def convert(value):
    # 拿到具体数字
	matched = value.group()
	if matched >= 6:
        return 9
    else:
        return 0
    
r = re.sub('\d', convert, s)
print(r)  # ABC09999D000

2.12re.match re.search

# re.match
# re.search    
# 都返回类对象
import re
s = 'ABC37978D432'

r = re.match('\d', s)  #  从字符串的开始位置开始匹配,若不符,则返回None
print(r)  # None
r = re.search('\d', s) #  在字符串中寻找可以匹配的
print(r)  # <re.Match object; span=(3, 4), match='3'>
print(r.group())  # 3
print(r.span())   # (3, 4)   返回匹配的区间

2.13group 分组

# group 分组  
# group()   默认值为 0   返回正则的完整匹配结果
import re
s = 'life is short, i use python'

r = re.search('life.*python', s)
print(r.group())  # life is short, i use python

# () 进行分组
r = re.search('(life.*python)', s)
print(r.group(0))  # life is short, i use python

# group(1)
r = re.search('life(.*)python', s)
print(r.group(1))  #  is short, i use

r = re.findall('life(.*)python', s)
print(r)  #  is short, i use

s = 'life is short, i use python, i love python'
r = re.search('life(.*)python(.*)python', s)
print(r.group(0))  # life is short, i use python, i love python
print(r.group(1))  #  is short, i use
print(r.group(2))  # , i love
print(r.group(0,1,2)) # ('life is short, i use python, i love python', ' is short, i use ', ', i love ')
print(r.groups())  #  (' is short, i use ', ', i love ')

一些例子

正则表达式

import re

line = 'booooooooobbby123'
r = re.match(".*(b.*b).*", line)
print(r.group(1))       #贪婪模式下,检索到最后符合的内容
print(r.group(0))

r = re.match(".*?(b.*?b).*", line)      #对  ? 后面的 检索进行非贪婪模式
print(r.group(1))  

#  +
print('~+~~~~~~~~~')
r = re.match(".*(b.+b)", line)      #+ 前面内容至少出现一次
print(r.group(1))  


print('|||||')
r = re.match(".*(bbb|bby123)", line)      #  | 或关系 存在一个即可
print(r.group(1))  

print('|||||')
r = re.match(".*(bby123|bbb)", line)      #  | 或关系 存在一个即可
print(r.group(1))

line2 = '15541861937'
regex_str = "(1[2345][0-9]{3})"
r = re.match(regex_str, line2)
print(r.group(0))

#汉字
print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = '你好吗'
r = re.match("[\u4E00-\u9FA5]+", line)
print(r.group(0))

print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = '你  好吗'
r = re.match("[\u4E00-\u9FA5]+", line)
print(r.group(0))

print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = 'study in 北京大学'
r = re.match(".*([\u4E00-\u9FA5]+大学)", line)
print(r.group(1))

print('[\u4E00-\u9FA5]+~~~~~~~~~~~~~~~~~~~~~')
line = 'study in 北京大学'
r = re.match(".*?([\u4E00-\u9FA5]+大学)", line)
print(r.group(1))


line = 'XXX出生于2001年6月'
line = 'XXX出生于2001/6/1'
line = 'XXX出生于2001-6-1'
line = 'XXX出生于2001-06-01'
line = 'XXX出生于2001-06'

regex_str = ".*出生于(\d{4}[年/-]\d{1,2}([月/-]\d{1,2}|[月/-]$|$))"

标签:匹配,re,python,第十一章,正则表达式,print,group,findall
From: https://www.cnblogs.com/lmc7/p/17566641.html

相关文章

  • 多元三角函数梯度下降法python
    多元三角函数梯度下降法梯度下降法简介梯度下降法是一种常用的优化算法,用于求解函数的最小值。它通过迭代地更新参数的值来逐步接近最优解。梯度下降法的核心思想是利用函数的梯度信息,即函数在当前点的导数值,来指导参数的更新方向。多元三角函数多元三角函数是指包含多个三角函......
  • Python基础day48
    伪类选择器<style>/*未访问时候显示的*/a:link{color:#FF0000;}/*鼠标移动到链接上*/a:hover{color:#FF00FF}/*选定的链接鼠标点击时出现*/a:active{c......
  • 在C语言中嵌入python,未定义的符号。PyExc_ImportError
    本文是小编为大家收集整理的关于在C语言中嵌入python,未定义的符号。PyExc_ImportError的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。中文English问题描述点击免费获取 CRMEB开源商城系统源码 ......
  • C语言内嵌Python import时提示undefined symbol错误及解决
    项目切gcc4.6版本时,C语言内嵌了python,运行bin文件import时出现importError错误,提示python-2.7.11/lib/python2.7/lib-dynload/_collections.so:undefinedsymbol:_Py_ZeroStruct. 基本代码如下: #include<Python.h>#include<stdio.h>#include<stdlib.h> intmain(......
  • 《对线面试官》| 高频 Python 面试题 pt.1
    1.聊聊python中的值传递和引用传递吧值传递:值传递意味着在函数调用时,将实际参数的值复制一份传递给函数的形式参数在函数内部,形式参数将作为局部变量使用,对形式参数的修改不会影响原始变量的值引用传递引用传递意味着在函数调用时,将实际参数的引用(内存地址)传递给函数的......
  • 输入一串字符统计其中非英文字母的字符数量python
    统计字符串中非英文字母的数量在我们的日常生活中,经常会遇到需要对字符串进行处理的情况,其中一个常见的需求是统计字符串中非英文字母的数量。这个问题可以通过编程来解决,特别是使用Python编程语言,它提供了许多强大的字符串处理函数和方法。字符串是什么在开始解决问题之前,我们......
  • 输出svg图形,显示数据标签 python
    输出SVG图形,显示数据标签的PythonSVG(ScalableVectorGraphics)是一种基于XML的矢量图形标准,它使用XML格式描述二维图形和图形应用程序。在Python中,我们可以使用不同的库来生成SVG图形,并通过添加数据标签的方式向图形添加数据信息。本文将介绍如何使用Python生成SVG图形,并显示数据......
  • 使用管理员身份运行python脚本
    使用管理员身份运行Python脚本在某些情况下,我们可能需要以管理员身份运行Python脚本。管理员权限允许我们执行一些需要特权的操作,例如修改系统文件或者安装软件。本文将介绍在不同的操作系统中如何以管理员身份运行Python脚本,并提供相应的代码示例。Windows系统在Windows系统中,......
  • 使用python语言设计并完成一个商店收银系统,需要包含以下功能
    使用Python设计商店收银系统商店收银系统是指用于处理销售交易的软件工具。它可以帮助商店管理者记录销售记录、计算总销售额、管理库存等。本文将介绍如何使用Python语言设计并完成一个简单的商店收银系统。功能需求我们需要实现以下功能:添加商品:商店收银系统需要能够添加新......
  • 使用python调用http接口
    使用Python调用HTTP接口在现代的软件开发中,经常需要用到HTTP接口来实现与服务器的数据交互。Python作为一门强大的编程语言,提供了丰富的库和工具来简化HTTP接口的调用过程。本文将一步步教会你如何使用Python来调用HTTP接口。整体流程下面是调用HTTP接口的整体流程,可以用表格展......