Python正则表达式

酥酥 发布于 2021-09-18 102 次阅读


1.语法规则

符号描述举例
.表示任何单个字符,除了换行符,除了换行符
[]表示一个字符集[abc]=a,b,c
[^]表示排除一个字符集[^abc]既不是a,也不是b,c
**前的字符任意扩展abc*=abc(c有0至无限个)
++前的字符任意扩展abc+=abc(c有1至无限个)
??前一个字符0至1次扩展abc=ab,abc
||左右表达式任意一个a|b表示a或b
{m}扩展{}前的内容m次ab{2}c=abbc
{m,n}扩展{}前的内容m至n(含n)次ab{1,2}c=abc,abbc
^这个表达式匹配字符串的开头部分^abc
$匹配字符串的结尾abc$
()分组标记,在括号内只能使用|标记符 
\d匹配一个数字字符 等价于[0-9] 
\D匹配一个非数字字符。等价于 [^0-9]。 
\w匹配包括下划线的任何单词字符 等价于[0-9a-zA-Z_] 
\W匹配包括下划线的任何单词字符。等价于[^A-Za-z0-9_]。 
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 
\S匹配任何非空白字符。等价于[^ \f\n\r\t\v]。 

2.经典案例

符号可以匹配
^[a-zA-Z0-9]+$表示由26个字母和数字组成的字符串
^[a-zA-Z]+$表示由26个字母组成的字符串
^?\d+$整数形式的字符串
^[0-9]*[1-9][0-9]*$正整数形式字符串
[1-9]\d{5}中国邮政编码
[\u4e00-\u9fa5]匹配中文字符
\d{3}-\d{8}|\d{4}-\d{7}国内电话号码

在匹配中尝试用原生字符串(raw string):不包含转义字符的字符串其中\不理解为转义符

3.re库函数

函数说明
re.search(pattern=,string=,flags=)返回match对象,pattern正则表达式或者原生字符串
re.match(pattern=,string=,flags=)只从开始位置其匹配对象
re.split(pattern=,string=,flags=,maxsplit=)按照匹配结果进行分割,返回列表类型 maxsplit限定最多匹配次数
re.finditer(pattern, string, flags=0)搜索字符串返回一个迭代类型,每个迭代对象是个match对象
re.sub(pattern=,repl=,string=,count=,flags=)count 匹配最大次数,repl 代替换的字符串
re.findall(pattern=,string=,flags=)以列表形式返回所有字符串

4.flags参数

修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

5.括号的使用

如果在正则表达式中使用了括号,可以使用group来特定匹配指定的内容(出现在search或者match函数中)

举例如下:

				
					>>>import re
>>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   # re.I 表示忽略大小写
>>> m = pattern.match('Hello World Wide Web')
>>> print m                               # 匹配成功,返回一个 Match 对象
<_sre.SRE_Match object at 0x10bea83e8>
>>> m.group(0)                            # 返回匹配成功的整个子串
'Hello World'
>>> m.span(0)                             # 返回匹配成功的整个子串的索引
(0, 11)
>>> m.group(1)                            # 返回第一个分组匹配成功的子串
'Hello'
>>> m.span(1)                             # 返回第一个分组匹配成功的子串的索引
(0, 5)
>>> m.group(2)                            # 返回第二个分组匹配成功的子串
'World'
>>> m.span(2)                             # 返回第二个分组匹配成功的子串
(6, 11)
>>> m.groups()                            # 等价于 (m.group(1), m.group(2), ...)
('Hello', 'World')
>>> m.group(3)                            # 不存在第三个分组
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: no such group
				
			

6. Match对象

Match 对象属性有

  1. string待匹配字符串

  2. re模式串

  3. pos匹配起始位置

  4. endpos 匹配终止位置

  5. group(0)返回匹配到的字符串

  6. start匹配到的位置

  7. end匹配到的终止位置

7. 贪婪匹配问题

re库默认使用贪婪匹配,默认输出最长的匹配到的内容
*?前一个字符0次或无数次扩展最小匹配 
+?前一个字符1次或无数次扩展最小匹配
??前一个字符0次或1次扩展最小匹配
{m,n}?前一个字符m次或n次扩展最小匹配

其他

re.compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

				
					>>>import re >>> pattern = re.compile(r'\d+')                    # 用于匹配至少一个数字
>>> m = pattern.match('one12twothree34four')     # 查找头部,没有匹配 >>> print m
None
>>> m = pattern.match('one12twothree34four', 2, 10)# 从'e'的位置开始匹配,没有匹配
>>> print m
None >>> m = pattern.match('one12twothree34four', 3, 10)
# 从'1'的位置开始匹配,正好匹配
>>> print m                                         # 返回一个 Match 对象 <_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0)# 可省略 0 '12'
>>> m.start(0)# 可省略 0 3
>>> m.end(0)# 可省略 0 5 >>> m.span(0)    # 可省略 0 (3, 5)
				
			

在上面,当匹配成功时返回一个 Match 对象,其中:

  • group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group()group(0)

  • start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;

  • end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;

  • span([group]) 方法返回 (start(group), end(group))

				
					import re
# re.search(pattern=,string=,flags=)   #返回match对象,pattern正则表达式或者原生字符串,flags控制标记flags=re.I忽略大小写
# # re.M  作用与^,能够匹配每行的开始部分
# # re.S  作用与.,能够匹配所有的字符(本来.不能匹配换行符)
# re.match()  #只从开始位置其匹配对象
# re.findall()   #以列表形式返回所有字符串
# re.split(pattern=,string=,flags=,maxsplit=)    #按照匹配结果进行分割,返回列表类型 maxsplit限定最多匹配次数
# re.finditer()   #搜索字符串返回一个迭代类型,每个迭代对象是个match对象
# re.sub(pattern=,repl=,string=,count=,flags=)  # count 匹配最大次数,repl 代替换的字符串
#Match 对象属性 string待匹配字符串 re模式串 pos匹配起始位置  endpos 匹配终止位置 group(0)返回匹配到的字符串 start匹配到的位置 end匹配到的终止位置
#re库默认使用贪婪匹配,默认输出最长的匹配到的内容   *?前一个字符0次或无数次扩展最小匹配   +?前一个字符1次或无数次扩展最小匹配
#??前一个字符0次或1次扩展最小匹配    {m,n}?前一个字符m次或n次扩展最小匹配


'''
.#表示任何单个字符
[]#表示一个字符集 [abc]=a,b,c
[^]#表示排除一个字符集[^abc]  既不是a,也不是b,c
*#*前的字符任意扩展 abc*  =ab,abc,abcc,abccc。。。(0次至无限次)
+#+前的字符任意扩展 abc+ = abc,abcc,abccc(1次至无限次)
?#?前一个字符0至1次扩展 abc? = ab,abc
|#|左右表达式任意一个
{m}#扩展{}前的内容m次 ab{2}c=abbc
{m,n}#扩展{}前的内容m至n(含n)次 ab{1,2}c=abc,abbc
^#这个表达式匹配字符串的开头部分 ^abc
$#匹配字符串的结尾 abc$
()#分组标记,在括号内只能使用|标记符
\d#等价于[0-9]
\w#等价于[0-9a-zA-Z_]

#以下是正则表达式的经典案例
^[a-zA-Z0-9]+$   #表示由26个字母和数字组成的字符串
^[a-zA-Z]+$     #表示由26个字母组成的字符串
^?\d+$     #整数形式的字符串
^[0-9]*[1-9][0-9]*$   #正整数形式字符串
[1-9]\d{5}  #中国邮政编码
[\u4e00-\u9fa5]    #匹配中文字符
\d{3}-\d{8}|\d{4}-\d{7}    #国内电话号码


raw string #不包含转义字符的字符串其中\不理解为转义符
'''