Python正则表达式
正则表达式的作用
正则表达式是一些由字符和特殊符号组成的字符串,它们描述了这些字符和字符的某种重复方式,因此能按某种模式匹配一个有相似特征的字符串的集合。
正则表达式的主要作用是被用来进行文本的检索、替换或者提取我们想要的字符串。
Python通过标准库的re模块支持正则表达式。
常用的特殊字符
符号 | 描述 |
---|---|
. |
匹配除换行符以外的任意字符 |
^ |
匹配字符串的开头 |
$ |
匹配字符串的结束 |
[] |
用于表示一个字符集合。比如 [abc] 匹配 a , b , 或者 c 。可以表示范围,用- 相连,如 [a-z] 将匹配任何小写字母。还可以使用^ 取反,如[^abc] 匹配除了a,b,c之外的字符 |
? |
对于前面的字符重复0到1次 |
* |
对于前面的字符重复0次到多次 |
+ |
对于前面的字符重复1次或多次 |
*? |
重复任意次,但尽可能少的重复 |
+? |
重复1次或多次,但尽可能少重复 |
?? |
重复0次或1次,但尽可能少重复 |
{m} |
指定重复匹配 m 次,少于 m 的话就会导致匹配失败。比如,a{6} 将匹配6个 a , 但是不能是5个 |
{m,} |
匹配至少m次 |
{m,n} |
匹配至少m次至多n次,比如,a{3,5}将匹配 3 到 5 个 a |
\w |
匹配字母、数字和下划线,等价于[A-Za-z0-9_] |
\W |
与\w 相反,匹配非字母、数字和下划线,等价于[^A-Za-z0-9_] |
\d |
匹配数字,等价于 [0-9] |
\D |
匹配非数字,等价于 [^0-9] |
\s |
匹配任意空白字符,包括空格、制表符、换页符等等。 |
\S |
匹配任意非空白字符。 |
\b |
匹配一个单词边界,也就是指单词和空格间的位置。 |
\B |
匹配非单词边界。 |
` | ` |
re模块
在 Python 中,re
模块提供了正则表达式常用的处理函数。
re.match
从字符串开始匹配,用正则表达式匹配指定的字符串,如果以符合条件的字符串开头则返回匹配对象,否则返回None。
match(pattern, string, flags=0)
- pattern:匹配的正则表达式
- string:要匹配的字符串
- flags:标识位,用来控制正则表达式的匹配方式,如:是否区分大小写、多行匹配等。
re.I
:忽略大小写。re.L
:表示特殊字符集\w
,\W
,\b
,\B
,\s
,\S
依赖于当前环境。re.M
:多行模式。re.S
:使.
匹配包括换行在内的所有字符。re.U
:表示特殊字符集\w
,\W
,\b
,\B
,\d
,\D
,\s
,\S
依赖于 Unicode 字符属性数据库。re.X
:为了增加可读性,忽略空格和#
后面的注释。
示例:
r1 = re.match("tom", "tomas")
print(r1) # <re.Match object; span=(0, 3), match='tom'>
print(r1.group()) # tom
- 使用
group(num)
或groups()
匹配对象函数来获取匹配表达式。
匹配对象方法 | 描述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
re.search
搜索第一次匹配的字符串,如果有匹配,则返回一个匹配对象。
search(pattern, string, flags=0)
示例:
import re
r1 = re.search("hello|hi", 'hellowqrehi')
print(r1) # b<re.Match object; span=(0, 5), match='hello'>
print(r1.group()) # hello
r2 = re.search("\d+(.*?)\d+", "1+2 3*4")
print(r2.group()) # 1+2
print(r2.groups()) # ('+',)
s = "www.baidu.com"
r3 = re.search("(www)\.(baidu|qq)\.(com)", s)
print(r3) # <re.Match object; span=(0, 13), match='www.baidu.com'>
# 获取的是匹配到的数据
print(r3.group()) # www.baidu.com
# 获取的是分组里面的数据
print(r3.groups()) # ('www', 'baidu', 'com')
re.split
用指定的模式分隔符拆分字符串,返回列表。
split(pattern, string, maxsplit=0, flags=0)
- pattern : 正则中的模式字符串。
- string : 要被查找替换的原始字符串。
- maxsplit : 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
- flags:标志位,用于控制正则表达式的匹配方式。
示例:
import re
s = "tom;jerry 你好, a=b"
print(re.split("[;, =]", s)) # ['tom', 'jerry', '你好', '', 'a', 'b']
re.sub
用于替换字符串中的匹配项。
sub(pattern, repl, string, count=0, flags=0):
- pattern:正则中的模式字符串。
- repl:替换的字符串,也可为一个函数。
- string:要被查找替换的原始字符串。
- count:模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
- flags:标志位,用于控制正则表达式的匹配方式。
示例:
import re
print(re.sub(r"tom", "jerry", "tom is boy")) # jerry is boy
print(re.sub(r'\D', "", "188-1234-4321")) # 18812344321
re.findall
返回与模式匹配的所有字符串组成的列表。
findall(pattern, string, flags=0)
示例:
import re
r1 = re.findall("\d+", "asd15f2rfsd634*^$%")
print(r1) # ['15', '2', '634']
r2 = re.findall("\D", "ab#$c1%7^32hj好48&_78")
print(r2) # ['a', 'b', '#', '$', 'c', '%', '^', 'h', 'j', '好', '&', '_']
r3 = re.findall("\w", "qw#$e^你好234_")
print(r3) # ['q', 'w', 'e', '你', '好', '2', '3', '4', '_']
r4 = re.findall("[abc]", "dfghjklop")
# 当没有符合的匹配时,返回空列表
print(r4) # []
r5 = re.findall("a?b", "abbeab abcb aab")
print(r5) # ['ab', 'b', 'ab', 'ab', 'b', 'ab']
r6 = re.findall("a{1,3}b", "abcdaabaed")
print(r6) # ['ab', 'aab']
r7 = re.findall("a.", "asdfabadf")
print(r7) # ['as', 'ab', 'ad']
r8 = re.findall("a.?", "asdfabadf")
print(r8) # ['as', 'ab', 'ad']
r9 = re.findall("a.+", "asdfabadf")
print(r9) # ['asdfabadf']
r10 = re.findall("a.*", "asdfabadf")
print(r10) # ['asdfabadf']
s = "188abcabdsa 199adfasdaf 13512344567 asdasdaf135 19955556666"
r11 = re.findall("(?:135|199)\d{8}", s) # ['13512344567', '19955556666']
print(r11) # ['13512344567', '19955556666']
s = "13512345432"
r12 = re.findall("^(?:135|199)[0-9]{8}$", s)
print(r12) # ['13512345432']
re.finditer
和 findall
类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
finditer(pattern, string, flags=0)
示例:
import re
it = re.finditer(r"\d{2}", "32ba3a25bcd43yt6")
for match in it:
print(match.group())
# 输入内容如下
32
25
43
re.compile
compile
函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供其他函数使用。
compile(pattern, flags=0)
示例:
import re
pattern = re.compile(r"\d+")
print(pattern.match("123abc1234jyhuqcyhqj").group()) # 123
print(pattern.search("aa12ab125").group()) # 12
print(pattern.findall("326qq-yu234yhj79")) # ['326', '234', '79']
print(pattern.split("as34f1dd55f")) # ['as', 'f', 'dd', 'f']