Python3 正则表达式模块 —— re
简述
Python正则表达式风格类似Perl
Python官方文档
注:Python正则表达式适用于
str和bytes类型,但不可混用;
正则表达式语法
特殊字符
.默认模式下,匹配任一字符(不包括换行),如果指定re.DOTALL则匹配任一字符(包括换行);^默认仅匹配字符串开始内容(仅指字符串内容的开始,不会匹配新的换行后的内容),如果指定re.MULTILINE则会匹配每个字符串行首的内容;$默认仅匹配字符串开始内容,指定re.MULTILINE匹配规则同^;*匹配前面正则表达式 0+ 次(表示匹配0或者多次);+匹配前面表达式 1+ 次;?匹配前面表达式 0/1 次;*?,+?,??限制*,+,?匹配程度,将其匹配内容最小化,如使用'<.*?>'匹配'<a>';{m}表示匹配的前面正则表达式的次数需满足m次;{m,n}表示匹配前面正则表达式m-n次,n设置为空时,设置m可设置最小次数;m为空时,设置n可设置为最大次数;{m,n}?表示进行最小值m次数进行匹配;对内容进行转义;[]用于声明字符集,如下所示:- 单独列出的字符,如[awk],表示匹配
a,w,k任一; - 字符范围,如[a-z](小写a至z),[0-5][0-9](00-59),[0-9A-Fa-f](表示十六进制);
- 特殊字符在
[]中失去特殊意义,如[(*^+)],匹配中间任一单一字符;^出现在[]中最前面位置时,表示匹配内容不包括[]中^字符后的正则匹配内容;]出现在匹配集合时,需对其进行转义或将其放置到匹配内容的最前面,如[()[]{}]或[][(){}]
- 在集合中接受字符类,如
Sw。
- 单独列出的字符,如[awk],表示匹配
|如A|B,对A或B进行匹配,如果A匹配成功,则不会进行B匹配,匹配从左到右进行;(...)匹配括号内的正则表达式,并表明匹配组的开始和结束;(?...)扩展符号((后?无具体意义,仅表示扩展的语法结构)不会创建新的组,但是(?P<name>...)是唯一的例外,如下为支持的扩展:(?aiLmsux)用于包含正则模块标志成为正则表达式的一部分,而不是将标志选项传递至re.compile()函数;a==re.A,表示ASCII-only匹配;i==re.I,表示ignore case匹配;L==re.L,表示locale dependent匹配;m==re.M,表示multi-line匹配;s==re.S,表示dot matches all匹配;u==re.U,表示Unicode matching匹配;x==re.X,表示verbose匹配;
(?:...)正则圆括号的非捕获版本,匹配括号内的任意正则表达式,但是在执行完匹配或者模型引用后,通过正则组匹配的子字符串无法被检索;(?imsx-imsx:...)为表达式部分设置或移除对应i m s x标志;(?P<name>...)类似正则圆括号匹配,但是通过正则组匹配的子字符串可以通过符号连接式的组名访问(组名必须为有效的Python标志,每个组名必须唯一的定义),命名组在三种上下文中的引用方式,如(?P<quote>['"].*?)(?P=quote):- 在同样的匹配模型中引用:
- (?P=quote)
- 1
- 当处理匹配对象,如m时:
- m.group('quote')
- m.end('quote')
- 在一个字符串中将其传递给re.sub()的repl选项:
- g
- g<1>
- 在一个字符串中将其传递给re.sub()的repl选项:
- g
- 1
- g
- 在同样的匹配模型中引用:
(?P=name)对命名组的后向引用,它匹配通过之前组名匹配的任何文本;(?#...)一种评论,括号内的内容被简单忽略;(?=...)此称谓‘前瞻断言’,当其匹配成功后,返回后面的内容,如:Isaac(?=Asimov)表示如果Asimov跟在Isaac后面,则匹配Isaac;
(?!...)此称谓’反向前瞻断言‘,与(?=...)相反;(?<=...)匹配正则表达式后面的内容,如:(?<=abc)匹配abcdef后为def;
(?<!...)与`(?<=...)相反;(?(id/name)yes-pattern|no-pattern)
特殊字符序列
umber匹配相同数字组的内容,仅可以匹配前99个组中的1个,0或3位的数字不会被当作组匹配解释,而是作为十进制值来做匹配;A仅匹配字符串的开始;匹配空字符串,但仅限于单词的开始或者结尾,空字符串指的是匹配内容为非组成单词的字母,如r'foo'匹配foo,foo.,bar foo,(foo)等;B匹配空字符串,但是仅仅当其不在单词的开始或者结尾,如r'pyB'匹配python3,py3,非py或py.;dstr匹配任何的Unicode十进制数字;bytes匹配任何十进制数字;D匹配任意非十进制数字,注意ASCII标志的区别,是d的反面;sstr匹配Unicode空白字符,包括v f和其它在印刷中授权的空白字符,如果指定ASCII标志,则只仅仅匹配v vf;S是s的反面,指匹配非空白字符;w匹配Unicode字符集,如果指定ASCII标志,则指[a-z0-9A-Z];W匹配w的反面,指定ASCII时,等同[^a-z0-9A-Z];仅仅匹配字符串的末尾。
模块内容
模块常量
- re.A | re.ASCII
- re.DEBUG
- re.I | re.IGNORECASE
- re.L | re.LOCALE
- re.M | re.MULTILINE
- re.S | re.DOTALL
- re.X | re.VERBOSE
模块函数
- re.compile(pattern, flag=0),生成正则表达式对象;
- re.search(pattern, string, flags=0) 如果无匹配,返回None;
- re.match(pattern, string, flag=0);
- re.fullmatch(pattern, string, flag=0);
- re.split(pattern, string, maxsplit=0, flag=0);
- re.findall(pattern, string, flag=0);
- re.finditer(pattern, string, flag=0);返回可迭代的匹配对象
- re.sub(pattern, repl, string, count=0, flag=0) 重构匹配对象;
- re.subn 同上,返回元组;
- re.escape(pattern) 生成对象的匹配模型,除了
ASCII字符,数字和_; - re.purge() 清除正则表达式缓存;
正则表达式对象
正则表达式对象生成:pattern = re.compile('pattern')
- regex.search(string[,pos[, endpos]])
- regex.match(string[, pos[, endpos]])
- regex.fullmatch(string[, pos[, endpos]])
- regex.split(string, maxsplit=0)
- regex.findall(string[, pos[, endpos]])
- regex.finditer(string[, pos[, endpos]])
- regex.sub(n)(repl, string, count=0)
- regex.flags
- regex.groups
- regex.groupindex
- regex.pattern 正则表达式模型字符串
匹配对象
匹配对象总返回True的布尔值。
match = re.search(pattern, string)
- match.expand(template)
- match.group([group1,...])
- match.groups(default=None)
- match.groupdict(default=None)
- match.start([group])
- match.end([group])
- match.span([group])
- match.pos
- match.endpos
- match.lastindex
- match.lastgroup
- match.re
- match.string