0%

Python的正则表达式

re库是Python关于正则表达式的一个内置模块,使用时无需下载,直接import即可。

这个模块提供与Perl语言中类似的正则表达式匹配操作,支持bytes和unicode两种格式的字符串,处理的字符串可以包含空字符以及超出ASCII码范围的字符(比如中文字符)。

本文主要来源是Python3.10.6 re库官方文档,提及的函数:

1
2
3
4
5
6
re.match(),re.fullmatch(),re.search(),re.findall(),group(),groups()
re.split()
re.sub(),re.subn()
re.compile(),re.finditer
re.escape()
re.purge()

1、查找

1
2
3
4
5
import re
re.match(pattern, string, flags=0) # 从字符串的起始位置匹配一个模式,匹配返回一个对象,不匹配返回none
re.fullmatch(pattern, string, flags=0) # 整个字符串与正则完全匹配,返回一个对象,不匹配返回none
re.search(pattern, string, flags=0) # 扫描整个字符串并返回第一个成功的匹配对象。
re.findall(pattern, string, flags=0) # 在字符串中找到匹配的所有子串,并返回一个列表,有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
  • pattern:正则中的模式字符串。pattern形式:r"正则"
  • string:要被查找替换的原始字符串。
  • flags:标志位,用于控制正则表达式的匹配方式
    • re.I:不区分大小写
    • re.M:多行匹配,影响 ^ 和 $
    • re.S:使 . 匹配包括换行在内的所有字符
    • re.U:根据Unicode字符集解析字符。这个标志影响 , , .
    • re.L:做本地化识别(locale-aware)匹配
    • re.X:该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
  • group(num)groups()是匹配对象(match object)的函数,可用来获取匹配到的内容(获取整体或括号的捕获内容)。group(0)group()效果相同,均为获取取得的字符串整体,group(n)返回第n组括号匹配的字符,groups() 返回所有括号匹配的字符,以tuple格式。

eg:

1
2
3
4
5
6
7
8
9
10
11
12
import re
str = "Hello World WoHe"

re.match(r"he",str,flags=re.I)
# out: <re.Match object; span=(0, 2), match='He'>
re.match(r"wo",str,flags=re.I) # match只查找字符串开头
# out: 空
re.fullmatch(r"^H\w+\s\w+\s\w+",str)
# out:<re.Match object; span=(0, 16), match='Hello World WoHe'>

re.search(r"wo",str,flags=re.I) # search只返回第一个成功匹配
# out:<re.Match object; span=(6, 8), match='Wo'>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
re.search(r"([a-zA-Z]*)\s([a-zA-Z]*)\s([a-zA-Z]*)",str).group()
# out:'Hello World WoHe'
re.search(r"([a-zA-Z]*)\s([a-zA-Z]*)\s([a-zA-Z]*)",str).group(0) # group(0)和group()效果相同,取获得整体
# out:'Hello World WoHe'

re.search(r"([a-zA-Z]*)\s([a-zA-Z]*)\s([a-zA-Z]*)",str).group(1) # 获得第一个括号捕获的内容
# out:'Hello'
re.search(r"([a-zA-Z]*)\s([a-zA-Z]*)\s([a-zA-Z]*)",str).group(2)
# out:'World'
re.search(r"([a-zA-Z]*)\s([a-zA-Z]*)\s([a-zA-Z]*)",str).group(3)
# out:'WoHe'

re.search(r"([a-zA-Z]*)\s([a-zA-Z]*)\s([a-zA-Z]*)",str).groups() # 返回所有括号匹配的字符
# out:('Hello', 'World', 'WoHe')
1
2
3
str = "Apple Banana Pear App applet Bear"
re.findall(r"\bA\w+",str,flags=re.I)
# out:['Apple', 'App', 'applet']

2、替换

1
2
3
import re
re.sub(pattern, repl, string, count=0, flags=0) # 将匹配的内容替换成其他内容
re.subn(pattern, repl, string, count=0, flags=0) #subn方法与sub()相同, 但返回一个元组, 其中包含新字符串和替换次数。
  • pattern : 正则中的模式字符串。pattern形式:r"正则"
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
1
2
3
4
5
6
re.sub(r"(?=9)",",","123456789")  # 在9前面插入一个逗号
# out:'12345678,9'
re.sub(r"(?=a)",".","AAAAAAAA",count=3,flags=re.I) # 在三个A前面插入.
# out:'.A.A.AAAAAA'
re.subn(r"(?=a)",".","AAAAAAAA",count=3,flags=re.I)
# out:('.A.A.AAAAAA', 3)

3、分隔

1
re.split(pattern, string, maxsplit=0, flags=0) 
1
2
3
str="1a2b3c"
re.split(r"\d",str,maxsplit=2)
# out:['', 'a', 'b3c']

4、正则表达式复用

一个脚本中,若多次使用到同一个正则表达式,为提高效率,可使用re.compile()生成一个正则表达式的对象,进行多次复用。

1
re.compile(pattern,flags=0)  # 语法格式
1
2
3
4
5
6
7
8
9
str = 'ads456'
fnum = re.compile(r"\d+")
fnum.search(str)
# out:<re.Match object; span=(3, 6), match='456'>

str1 = 'fadskgf'
falp = re.compile(r"(AD)+",flags=re.I)
falp.search(str1)
# out:<re.Match object; span=(1, 3), match='ad'>
1
2
3
4
str = "Apple Banana Pear App applet Bear"
fia = re.compile(r"\bA\w+",flags=re.I)
fia.findall(str)
# out:['Apple', 'App', 'applet']

5、迭代器

1
re.finditer(pattern, string, flags=0) # 在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个匹配对象(match object)迭代器返回。
1
2
3
4
5
6
7
8
str="1a2b3c"
it = re.finditer(r"\d",str)
for i in it:
print(i.group())
# out:
1
2
3

6、其他

  • re.escape(pattern):转义 pattern 中的特殊字符即转义正则表达式中的特殊字符,一般用于目标文本中含有正则表达式元字符的情况。

  • re.purge():清除正则表达式缓存。编译正则表达式时,将对结果进行缓存,确保短期内如果再次编译相同的正则表达式,则可以直接检索结果,清空缓存可以节省开销。

推荐阅读:

1、re — Regular expression operations — Python 3.10.6 documentation 2、Python 正则表达式 | 菜鸟教程 (runoob.com) 3、Regular Expression HOWTO — Python 3.10.6 documentation 4、https://zhuanlan.zhihu.com/p/361601136

+