Bootstrap

python 正则表达式re 模块的基本使用方法

一、正则化表达式语法

1、如下表格:

语法意义
.匹配除换行外的任意字符(如果DOTALL则连换行也匹配)
^匹配字符串开始 (如果MULTILINE,也匹配换行符之后)
$匹配字符串结束(如果MULTILINE,也匹配换行符之前)
*匹配0个或更多个由前面的正则表达式定义的片段,贪婪方式(尽可能多的匹配)
+匹配1个或更多个由前面的正则表达式定义的片段,贪婪方式
?匹配0个或1个由前面的正则表达式定义的片段,贪婪方式
*?, +?,??非贪婪版本的*, +, 和? (尽可能少的匹配)
{m,n}匹配mn次由前面的正则表达式定义的片段,贪婪方式
{m,n}?匹配mn次由前面的正则表达式定义的片段,非贪婪方式
[…]匹配方括号内内的字符集中的任意一个字符
|等于“或”
(…)匹配括号内的表达式,也表示一个组
/number匹配先前匹配过的组(通过序号,组自动从1 - 99编号)
/A匹配字符串开始
/b匹配单词边界
/B匹配一个空串(非单词边界)
/d匹配任意数字等价于[0-9]
/D匹配任意非数字等价于[^\d]
/s匹配任意空白字符
/S匹配任意非空字符
/w匹配字母数字
/W匹配非字母数字
/Z匹配字符串结束
//匹配反斜杠

2、元字符

① . 通配符(除了 \n不能匹配,可以匹配其他任意一个字符)
② ^ 以该字符串开头
③ $ 以该字符串结尾
④ * 重复前一个字符,0~无穷次
⑤ + 重复前一个字符,1~无穷次在这里插入代码片
⑥ ? 匹配前一个字符,0~1个
⑦ { } 自定义重复范围,例:
{0,} 重复0~无穷次
{1,2} 重复1~2次
{6} 重复6次
注:默认上述元字符均为贪婪匹配,后面加 ?,变为惰性匹配

import re

v1 = re.findall("a..b", "baasbartb")
print(v1)  # ['aasb', 'artb']
v2 = re.findall("^ba", "baasbartb")
print(v2)  # ['ba']
v3 = re.findall("tb$", "baasbartb")
print(v3)  # ['tb']
v4 = re.findall("a*", "baasbartb")
print(v4)  # ['', 'aa', '', '', 'a', '', '', '', '']
v5 = re.findall("a+", "baasbartb")
print(v5)  # ['aa', 'a']
v6 = re.findall("a?", "baasbartb")
print(v6)  # ['', 'a', 'a', '', '', 'a', '', '', '', '']
v7 = re.findall("a{1,2}", "baasbartaaab")
print(v7)  # ['aa', 'a', 'aa', 'a']
v8 = re.findall("a{1,2}?", "baasbartaaab")
print(v8)  # ['a', 'a', 'a', 'a', 'a', 'a']

二、re模块常用方法

1、compile

将正则表达式的样式编译为一个 正则表达式对象 (正则对象),可以用于匹配,通过这个对象的方法 match(), search() 以及其他如下描述。

序列

co = re.compile("\d+")
v = co.findall("wded123fw54") # v = re.findall(co,"wded123fw54")也可以
print(v)    # ['123', '54']

等价于

v = re.findall("\d+", "wded123fw54")
print(v)    # ['123', '54']

如果需要多次使用这个正则表达式的话,使用 re.compile() 和保存这个正则对象以便复用,可以让程序更加高效。

2、findall

返回所有满足匹配条件的结果,放在列表里。

import re

v1 = re.findall("\d+", "wded123fw54")
print(v1)  # ['123', '54']

3、search

只返回第一个查到结果,构成的对象。可通过group方法得到匹配的字符串。没查到结果,返回None

v2 = re.search("\d+", "wded123fw54").group()
print(v2)  # 123

v3 = re.search("\d{5}}", "wded123fw54")
print(v3)   # None

4、match

类似search,但只从字符串开头匹配。

v = re.match("\d+", "wded123fw54")
print(v)  # None

5、split

分割

v1 = re.split('\d+',"wded123fw54")
print(v1)  # ['wded', 'fw', '']

v2 = re.split('\d+',"wded123fw54a",1)
print(v2)  # ['wded', 'fw54a']

6、sub

替换

v1 = re.sub('\d+',"A","wded123fw54")
print(v1)  # wdedAfwA

v2 = re.sub('\d+',"A","wded123fw54",1)
print(v2)  # wdedAfw54

7、finditer

类似findall方法,但是返回的是一个迭代器

v1 = re.finditer("\d+", "wded123fw54")
print(v1)  # <callable_iterator object at 0x000002676E7004C0>
print(v1.__next__().group())    # 123
print(v1.__next__().group())    # 54

更多re用法可查询官网:https://docs.python.org/zh-cn/3/library/re.html#re.purge

;