正则表达式在实际的开发中是非常有用的一项技术,可以非常强大的来处理各种字符串的模式匹配。
1. 什么是正则表达式
正则表达式是一些由字符和特殊符号组成的字符串,它们描述了这些字符和符号的某种重复方式,能够按照某种预先设定的模式来匹配一个具有相似特征的字符串的集合。Python通过标准库的re模块来进行正则表达式的解释和功能的实现。在学下re模块之前,我们先需要了解一点知识。
(1)元字符
元字符指在正则表达式中具有特殊含义的专用字符,可以用来规定其前导字符在目标对象中出现的模式。常用的元字符如下表所示。
- `.` 匹配任意单个字符(换行符除外)。
- `^` 匹配字符串的开头。
- `
AI最火语言python之正则表达式 - 今日头条 匹配字符串的末尾。- `*` 匹配前面的子表达式零次或多次。
- `+` 匹配前面的子表达式一次或多次。
- `?` 匹配前面的子表达式零次或一次。
- `{n}` 匹配前面的子表达式恰好`n`次。
- '{n,}` 匹配前面的子表达式至少`n`次。
- `{n,m}` 匹配前面的子表达式至少`n`次,至多`m`次。
- `\d` 匹配任意数字,等价于`[0-9]`。
- `\D` 匹配任意非数字,等价于`[^0-9]`。
- `\w` 匹配任意字母、数字或下划线,等价于`[a-zA-Z0-9_]`。
- `\W` 匹配任意非字母、非数字、非下划线字符。
2. 强大的re模块
re模块是正则表达式模块,这是一个Python内置模块,使用前直接引入import re。该模块提供了文本查找和匹配、文本替换、文本分割等功能。re模块中常用的函数及方法如下表所示:
- search() 从任意位置开始匹配,匹配成功返回匹配对象,否则返回 `None`。 `re.search(r'\d+', 'abc123def').group()` 返回 `'123'`
- match() 从头匹配,匹配成功返回匹配对象,失败返回 `None`。 |`re.match(r'\d+', '123abc').group()` 返回 `'123'`
- compile() 对正则表达式进行预编译,并返回一个 `Pattern` 对象。 `pattern = re.compile(r'\d+')`
- findall() 在目标对象中从左至右查找与正则对象匹配的所有非重叠子串,将这些子串组成一个列表并返回。 `re.findall(r'\d+', 'abc123def456')` 返回 `['123', '456']`
- finditer() | 功能与 `findall()` 相同,但返回的是迭代器对象。 `for match in re.finditer(r'\d+', 'abc123def456'): print(match.group())`
- split() 将目标对象使用正则对象分割,成功返回分割后的列表,可指定最大分割次数。 `re.split(r'\s+', 'a b c d')` 返回 `['a', 'b', 'c', 'd']`
- sub() |搜索文件中与正则对象匹配的子串,使用指定字符串替换,并返回替换后的对象。 `re.sub(r'\d+', '#', 'abc123def')` 返回 `'abc#def'`
- subn() 搜索功能与 `sub()` 相同,但返回一个元组,包含替换后的对象和替换次数。 `re.subn(r'\d+', '#', 'abc123def')` 返回 `('abc#def', 1)`
- group() 返回全部匹配对象。 `match = re.search(r'(\d+)', 'abc123def'); match.group()` 返回 `'123'`
- groups() 返回一个包含全部匹配的子组的元组,若匹配失败,则返回空元组。 `match = re.search(r'(\d+)(\w+)', 'abc123def'); match.groups()` 返回 `('123', 'def')`
我们拿其中几个开发中用到比较多的函数来做说明。
(1)search函数
re.search 扫描整个字符串并返回第一个成功的匹配对象,如果匹配失败search()就返回None。re.search语法结构:
re.search(pattern, string, flags=0)
函数参数说明:
- pattern:匹配的正则表达式。
- string:要匹配的字符串。
- Flags:标志位,用于控制正则表达式的匹配方式用。见下表所示
flags 说明
- re.I :忽略大小写
- re.L :使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
- re.M :多行匹配,改变 `^` 和 `
AI最火语言python之正则表达式 - 今日头条 的行为- re.S :点任意匹配模式,改变 `.` 的行为
- re.U :根据 Unicode 字符集解析字符
- re.A :根据 ASCII 字符集解析字符
- re.X :允许使用更灵活的格式(可以是多行、忽略空白字符、可加入注释)书写正则表达式,以便表达式更易理解
例如:
import re pattern = re.search(r'\d', '我叫骑着蜗牛百米冲刺,今年99岁') print(pattern.group())
程序运行结果为
9
从上文我们也已经指导 `\d` 表示匹配任意数字,等价于`[0-9]`。
(2)match函数
re.match()函数是从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None。
match()函数语法格式如下:
match(pattern, string, flags=0)
match()函数中参数的功能与search()函数相同,此处不再赘述。search与match都是一次查找,找到后返回一个match对象,找不到返回none。不同是match从头找,search从任何位置找。
举例:
import re pattern = re.match(r'\d', '我叫骑着蜗牛百米冲刺,今年99岁') print(pattern)
程序运行结果:
None
结果已经非常明确了,就是我上面说过三次的内容的那句话。
(3)预编译complie函数
如果需要对一个正则表达式重复使用,那么可以使用compile()函数对其进行预编译,以避免每次都要编译正则表达式。
complie()函数语法格式如下:
compile(pattern, flags=0)
- 参数pattern表示一个正则表达式
- 参数flags用于指定正则匹配的模式参数已
具体操作方法如下:
使用 compile()函数将正则表达式的字符串形式编译为一个 Pattern 对象
通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果。
例如:
import re text = "Hello python" pattern = re.compile(r"python", flags=re.I) match = pattern.search(text) if match: print("Found match:", match.group()) else: print("No match found")
运行结果:
Found match: python
当需要在多个字符串上执行相同的正则表达式匹配时,预编译可以避免重复编译,提高效率。
(4)findall()函数
findall()函数在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
findall()函数语法格式如下:
findall(string[, pos[, endpos]])
函数参数说明:
- string : 待匹配的字符串。
- pos : 可选参数,指定字符串的起始位置,默认为 0。
- endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。
举例:
import re text = "Hello world, this is a test." pattern = r"\b\w+" matches = re.findall(pattern, text) print(matches)
程序运行结果:
['Hello', 'world', 'this', 'is', 'a', 'test']
(5)分割split()函数
split()函数按照能够匹配的子串将字符串分割后返回列表。split()函数语法格式如下:
split(pattern, string, maxsplit=0, flags=0)
函数参数说明:
- pattern:表示需要传入的正则表达式。
- string:表示待匹配的目标文本。
- maxsplit:用于指定分隔的次数,默认值为0,表示匹配指定模式并全部进行分割。
- flags:标志位,用于控制正则表达式的匹配方式。
举例:
import re text = "hello,python,java" pattern = r"," # 以逗号为分隔符 result = re.split(pattern, text) print(result)
程序运行结果如下:
['hello', 'python', 'java']
### (6)sub()函数
re.sub用于替换字符串中的匹配项。sub函数语法格式如下:
re.sub(pattern, repl, string, count=0)
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
举例:
import re text = "Hello java! Hello Python!" pattern = r"Hello" repl = "Hi" result = re.sub(pattern, repl, text) print(result)
程序运行结果:
Hi world! Hi Python!
从程序结果可以看出,Hello字符串都被Hi字符串替换了。