Python正则表达式
常用函数
match(pat, str):检查字符串的开头是否符合某个模式
search(pat, str):检查字符串中是否符合某个模式
findall(pat, str):返回所有符合某个模式的字符串,以列表形式输出
finditer(pat, str):返回所有符合某个模式的字符串,以迭代器形式输出
split(pat, str):以某个模式为分割点,拆分整个句子为一系列字符串,以列表形式输出
sub(pat, repl, str):句子 str 中找到匹配正则表达式模式的所有子字符串,用另一个字符串 repl 进行替换
compile(pat):将某个模式编译成对象,供之后使用
re.match
从起始位置开始匹配,返回匹配的对象;若无匹配,则返回none
语法:
re.match(pattern,string, flags=0)
参数 | 说明 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志符,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等 |
re.search
遍历字符串,并返回第一个成功的匹配
语法:
re.search(pattern,string, flags=0)
re.sub
替换字符串中的匹配项
re.sub(pattren,repl,string,count=0,flags=0)
参数:
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。(可选)
- flags : 编译时用的匹配模式,数字形式。(可选)
e.g.1
import re
phone = "2004-959-559 # 这是一个电话号码"
num = re.sub(r'#.*$',"",phone) #去除注释
## 2004-959-559
e.g.2
import re
def double_num(matched):
value=int(matched.group('value'))
return str(value*2)
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))
compile函数
编译正则表达式,生成pattren对象,供match() 和 search() 使用。
语法:
re.compile(pattern[,flags])
- pattern : 一个字符串形式的正则表达式
- 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 为了增加可读性,忽略空格和’ # '后面的注释
e.g.1
import re
pattern = re.compile(r'\d+')
pattren.metch('string')
findall
返回一个列表,包含所有匹配的子串
re.findall(pattern, string, flags,pos,endpos)
参数:
- string 待匹配的字符串。
- pos 可选参数,指定字符串的起始位置,默认为 0。
- endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。
e.g.1
import re
pattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('aaa 123 bbbb 456') #['123', '456']
result2 = pattern.findall('aa88bbb123ccccc456', 0, 10) #['88', '12']
re.finditer
返回一个迭代器,包含所有匹配的子串
语法:
re.finditer(pattern, string, flags,pos,endpos)
e.g.1
import re
it = re.finditer(r"\d+","12a32bc43jf3")
for match in it:
print (match.group() )
re.split
匹配的分隔符两边的实体都会被当成是结果中的元素返回。如果正则表达式中包含一个括号捕获分组,那么被匹配的文本也将出现在结果列表中,目的是保留分割字符串。
s = 'Kobe Bryant loves Gianna Bryant'
print( re.split(r'\s', s) )
['Kobe', 'Bryant', 'loves', 'Gianna', 'Bryant']
转义字符
常用
点 . 表示除新行(\n)的任意字符,它是个通配符。
托字符 ^ 表示字符串开头。
美元符 $ 表示字符串结尾。
贪婪模式:
-
*
表示后面可跟 0 个或多个字符 -
+
表示后面可跟 1 个或多个字符 -
?
表示后面可跟 0 个或 1 个字符
非贪婪模式:
-
*?
表示后面可跟 0 个或多个字符,但只取第一个 -
+?
表示后面可跟 1 个或多个字符,但只取第一个 -
??
表示后面可跟 0 个或 1 个字符,但只取第一个
限定边界
{}
可以设定具体的上界或(和)下界,使得代码更加有效也更好读懂,规则如下:
- {n} 左边的字符串是否出现 n 次
- {n, } 左边的字符串是否出现大于等于 n 次
- {, n} 左边的字符串是否出现小于等于 n 次
- {n, m} 左边的字符串是否出现在 n 次和 m 次之间。
其他
反斜杠 \ 可对特殊字符进行转义,也可对普通字符转义。
\b:匹配空字符串,但仅适用于单词的“首尾”
\B:匹配空字符串,但仅适用于单词的“非首尾”
\d:匹配任何“数字”字符,等价于 [0-9]
\D:匹配任何“非数字”字符,等价于[^0-9]
\s:匹配任何“空白”字符,等价于[\t\n\r]
\S:匹配任何“非空白”字符,等价于 [^\t\n\r]
\w:匹配任何“字母数字下划线”字符,等价于[a-zA-Z0-9_]
\W:匹配任何“非字母数字下划线”字符,等价于[^a-zA-Z0-9_]
\A:匹配句子的“开头”字符,等价于 ^
\Z:匹配句子的“结尾”字符,等价于 $
\t:匹配句子的“制表键 (tab)”字符
\r:匹配句子的“回车键 (return)”字符
\n:匹配句子的“换行键 (newline)”字符