Python正则表达式
2019-06-30 本文已影响0人
Recalcitrant
目录
一、正则表达式语法
二、Python支持的其它正则表达式的标志位flags
三、标准库模块 re
Python正则表达式
一、正则表达式语法
1.基本模式
2.特殊字符集
语法 | 说明 | 模式示例 | 匹配 |
---|---|---|---|
\d | 匹配任意一个数字字符,等价于[0-9] | a\db | a1b |
\D | 匹配任意一个非数字字符,等价于[^0-9] | a\Db | aAb |
\s | 匹配任意一个空白字符,等价于[ \t\n\r\f\v] | a\sb | a b |
\S | 匹配任意一个非空白字符,等价于[^ \t\n\r\f\v] | a\Sb | aAb |
\w | 匹配任意一个 alphanumeric character,等价于[a-zA-Z0-9_] | a\wb | azb或aZb或a1b或a_b |
\W | 匹配任意一个 non-alphanumeric character,等价于[^a-zA-Z0-9_] | a\Wb | a-b或a b |
3.匹配数量
语法 | 说明 | 模式示例 | 匹配 |
---|---|---|---|
prev* | 匹配0个或多个 prev,尽可能多地匹配,贪婪模式,等价于{0,} | ab* | a或ab或abb或abbb,注意是匹配字符a后面跟0个或多个字符b |
prev*? | 匹配0个或多个 prev,尽可能少地匹配,非贪婪模式 | ab*? | a,非贪婪模式下匹配0个字符b |
prev+ | 匹配1个或多个 prev,尽可能多地匹配,贪婪模式,等价于{1,} | ab+ | ab或abb或abbb |
prev+? | 匹配1个或多个 prev,尽可能少地匹配,非贪婪模式 | ab+? | ab,非贪婪模式下匹配1个字符b |
prev? | 匹配0个或1个 prev,尽可能多地匹配,贪婪模式,等价于{0,1} | ab? | a或ab |
prev?? | 匹配0个或1个 prev,尽可能少地匹配,非贪婪模式 | ab?? | a,非贪婪模式下匹配0个字符b |
prev{m} | 匹配m个连续的 prev | a{3} | aaa |
prev{m,n} | 匹配m到n个连续的 prev ,尽可能多地匹配,贪婪模式。n可选,如果不指定,则表示m到无穷多个连续的 prev | a{3,5} | aaa或aaaa或aaaaa |
prev{m,n}? | 匹配m到n个连续的 prev ,尽可能少地匹配,非贪婪模式 | a{3,5}? | aaa |
4.边界
语法 | 说明 | 模式示例 | 匹配 |
---|---|---|---|
^prev | 匹配以 prev 开头的字符串(脱字符)。多行文本中,默认^只会匹配第一行的开头位置,如果设置了re.MULTILINE标志位,则^也会匹配换行符之后的开头位置 | ^ab | abcd |
prev$ | 匹配以 prev 结尾的字符串。多行文本中,默认$只会匹配最后一行的结尾位置,如果设置了re.MULTILINE标志位,则$也会匹配换行符之前的结尾位置 | ab$ | 只匹配ab。如果是.*ab$则会匹配123ab,否则使用ab\Z |
\b | 单词边界。Matches the empty string, but only at the beginning or end of a word. A word is defined as a sequence of word characters. Note that formally, \b is defined as the boundary between a \w and a \W character (or vice versa), or between \w and the beginning/end of the string. 注意: \b在Python中默认会被转义为\x08表示退格,需要将整个正则表达式指定为原始字符串(在前面加个r),即r'\bfoo\b' | r'\bfoo\b' 请使用re.findall()测试 | 匹配foo或foo.或(foo)或bar foo baz,但不匹配foobar或foo3 |
\B | 非单词边界。Matches the empty string, but only when it is not at the beginning or end of a word. \B is just the opposite of \b. | py\B | 匹配python或py3或py2,但不匹配py或py.或py! |
\A | 仅匹配以之开头的字符串 | \Aab | abcde |
\Z | 仅匹配以之结尾的字符串 | ab\Z | 123ab |
5.分组
语法 | 说明 | 模式示例 | 匹配 |
---|---|---|---|
(expr) | 将小括号内的表达式作为一个分组,后面可以接表示数量的特殊字符。每个分组的编号从1开始递增,后续可以使用\1、\2这样引用分组匹配到的内容 | a(bc)?d | ad或abcd,不匹配abcbcd |
expr1 │expr2 | 匹配 expr1 或 expr2 ,a│b│c等价于[abc],都表示匹配字符a或b或c。从左至右,如果匹配了某个表达式,则跳过后续表达式。expr1 │ expr2表示作用于整个待匹配的字符串,而(expr1│expr2)加入小括号内表示分组,不是整个字符串 | p(i│u)g | pig或pug |
\1 | 引用编号为1的分组匹配到的字符串,同理\2表示引用第2个分组。注意: 此时为了不让Python自动将\1转义为\x01,需要将整个正则表达式指定为原始字符串(在前面加个r),即r'a(\d)b\1c' | r'a(\d)b\1c' | a3b3c |
(?P<NAME>expr) | 类似于(expr),同时给分组指定了一个别名NAME,注意是大写的字母P | r'a(?P<quote>\d)b\1c' | a3b3c |
(?P=NAME) | 引用别名为NAME的分组,当然也可以继续使用编号的形式引用分组如\1,此时要加r指定为原始字符串 | a(?P<quote>\d)b(?P=quote)c 或 r'a(?P<quote>\d)b\1c' | a3b3c |
6.扩展语法
语法 | 说明 | 模式示例 | 匹配 |
---|---|---|---|
(?:expr) | 非捕获组。如果分组后续要被\1这样的形式引用,使用(expr),这叫捕获组,后面可以接表示数量的特殊字符。如果不想分组被引用,就使用(?:expr),这叫非捕获组,后面可以接表示数量的特殊字符 | a(?:\d)+bc,此时不支持引用分组,像r'a(?:\d)+b\1c'这样的属于语法错误 | a333bc |
prev(?=next) | 如果后面为 next,则返回 prev | ab(?=\d) | 如果ab后面紧跟一个数字,则匹配,比如ab3,返回ab |
prev(?!next) | 如果后面不是 next,则返回 prev | ab(?!\d) | 如果ab后面不是紧跟一个数字,则匹配,比如abc,返回ab |
(?<=prev)next | 如果前面为 prev,则返回 next | (?<=\d)ab | 如果ab前面是一个数字,则匹配,比如1ab,返回ab |
(?<!\d)ab | 如果前面不是 prev,则返回 next | (?<!\d)ab | 如果ab前面不是一个数字,则匹配,比如Aab,返回ab |
二、修饰符
Python支持的其它正则表达式的标志位flags
- re.A: 或re.ASCII,使\w/\W/d/\D/\s/\S/\b/\B只匹配ASCII字符,不匹配Unicode字符。
- re.I: 或re.IGNORECASE,忽略大小写,[A-Z]会匹配小写字母。
- re.M: 或re.MULTILINE,多行模式,改变^或$的默认行为。
- re.S: 或re.DOTALL,使”.“匹配任何字符,包括换行。如果没有此标志,.将匹配除换行以外的任何内容。
- re.U: 或re.UNICODE,默认使用此标志位,\w/\W/d/\D/\s/\S/\b/\B会匹配Unicode字符,如果指定了re.A标志,则re.U失效。
- re.X: 或re.VERBOSE,允许整个正则表达式写成多行,忽略空白字符,并可以添加#开头的注释,这样更美观。
三、标准库模块 re
1.re.match():从字符串开头开始匹配
re.match():从字符串起始位置匹配正则表达式。如果匹配成功,则返回结果,否则返回None。
2.re.search():寻找首次匹配
re.search():扫描整个字符串,返回第一个匹配结果。
3.re.findall()或re.finditer():寻找所有匹配
re.findall():扫描整个字符串,返回所有的匹配结果组成的列表。匹配失败则返回空列表。
4.re.split():按匹配切分
# 按换行符切分字符串,返回切分后的列表
re = re.split("\n", content)
5.re.sub():替换匹配
re.sub():替换格式匹配的文本。
示例:
# 删去字符串中的所有数字
content = '12df4324jnhfdsf4324kjnvfdv434fdsi3244jkf'
reg = '\d+'
r = re.sub(reg, '', content)
print(r)
运行结果
6.re.compile():创建匹配模式
示例:
c1 = '2019-06-29 14:10'
c2 = '2016-09-13 17:36'
p = re.compile("\d{2}:\d{2}")
print(re.sub(p, '', c1))
print(re.sub(p, '', c2))
运行结果