正则表达式: re

2021-03-17  本文已影响0人  WuYankang

Python 通过标准库的 re 模块支持正则表达式,re 模块的函数和正则表达式的使用规则记录于此,便于日后查阅。

re模块函数

函数/方法 描述
compile( pattern, flags=0 ) 对正则表达式模式pattern进行编译,flags为可选标识符,函数返回一个正则表达式对象( re.Pattern )

re模块函数 / re.Pattern对象方法

函数/方法 描述
match( pattern, string, flags=0 ) 使用正则表达式pattern匹配(从头匹配)字符串string,如果匹配成功,返回一个匹配对象(re.Match);否则返回None
search( pattern, string, flags=0 ) 在字符串string中搜索正则表达式pattern的第一次出现,如果成功, 返回一个匹配对象(re.Match);否则返回None
findall( pattern, string, flags=0 ) 在字符串string中搜索正则表达式pattern的所有(非重复)出现;返回一个匹配部分的列表(总是返回一个列表,若没有找到匹配部分,则返回空列表)。
finditer( pattern, string, flags=0 ) 与findall相同,但返回的是迭代器,迭代器的元素为所有的匹配对象(re.Match),若没有匹配部分,则返回一个空迭代器。
split( pattern, string, maxsplit=0 ) 根据正则表达式pattern把字符串string分割为一个列表,返回该列表,若maxsplit参数为非零,则最多分割maxsplit次(默认分割所有)。若pattern无匹配部分,则返回包含一个元素的列表,该元素为string。
sub( pattern, repl, string, count=0 ) 把字符串string中所有匹配pattern的地方替换成字符串repl,count不为零时,替换count次,返回替换后的字符串。
subn( pattern, repl, string, count=0 ) 同sub(),但返回由替换后的字符串和替换次数组成的元组。

这部分函数即是re模块的函数,同时正则表达式对象(re.Pattern)也有同名的方法,功能也相同。当通过compile()对正则表达式进行预编译后,返回的正则表达式对象便可调用方法。但预编译不是必须的,直接调用函数也能实现目的,不过最终还是会被编译,所以使用预编译的正则表达式能够提升性能。
直接调用re模块函数的使用方法:

re.match( pattern, string )     # pattern为正则表达式字符串,如'[A-Z]+'(至少出现一次大写字母)

作为正则表达式对象(re.Pattern)方法的使用方法:

pattern = re.compile( '[A-Z]+' )
pattern.match( string )

匹配对象(re.Match)方法

匹配对象(re.Match)由search()和match()函数(方法)返回,此外finditer()返回的迭代器的元素也是匹配对象。匹配对象需要调用group()/groups()方法才能返回匹配(这里说的匹配是指match()的从头匹配和search()的搜索)的内容。

方法 描述
group( num ) num=0 时(默认),返回完整匹配部分(字符串);num=1/2/3... 时,返回对应子组匹配部分,子组编号顺序按从左到右。
groups() 返回所有子组匹配部分组成的元组。

re正则表达式pattern规则

符号 说明 举例
str 匹配相同字符串 'foo' ,匹配foo
[ABcd] [ ],匹配[ ]中的任意一个字符 [Aa],匹配A或a
[A-Z] 匹配A~Z的任意一个字符,根据Ascii顺序 [A-Za-z0-9],匹配任意字母、数字
[^...] 不匹配[ ]中出现的任意一个字符 [^a-z],不匹配小写字母
pattern1|pattern2 管道符,匹配正则表达式pattern1或pattern2 'foo|A[1-9]' ,匹配foo或A1到A9
. 句点,匹配除换行符外任意一个单个字符,必须匹配一个才算匹配成功 ‘f.oo' ,匹配foo或fxoo,x是换行符外任意字符
^ 从字符串开头开始匹配 '^Dear' ,匹配开头的Dear
$ 美元符号,匹配字符串结尾 ‘txt$' ,匹配结尾的txt
pattern* 星号,匹配pattern零次或多次 '[a-z]*' ,匹配任意长度的小写字母
pattern? 问号,匹配pattern零次或一次 'bags?' ,匹配bag或bags
pattern{N} {N},匹配pattern N次 'go{2}d',匹配good
pattern{N,M} {N,M},匹配pattern n次,N <= n <= M '[0-9]{5,9}',匹配5到9位数字
? 区别于pattern?的问号,只用在" * "、" + "、" ? "、" {} "后面,因为这些符号默认是贪婪匹配的(取匹配次数最多的情况)。? 表示非贪婪匹配(取匹配次数最少的情况 ) re.search('.*?[0-9]', 'abc123').group()返回'abc1',而不是'abc123'
() 括号中的正则表达式可保存为子组,可通过group/groups返回子组对应的匹配部分

子组举例:

x = re.search('([A-Z])([0-9]+)', 'A123')   # 正则表达式'([A-Z])([0-9]+)'包含两个子组
x.group()          # 返回'A123'
x.group(1)        # 返回'A',对应子组([A-Z])
x.group(2)        # 返回'123',对应子组([0-9]+)
x.groups()        # 返回元组('A','123')

特殊字符

符号 说明
\d 匹配任何数字,等同于[0-9]
\D \d的反义,任何非数字
\w 小写w,任何数字字母字符,等同于[A-Za-z0-9]
\W 大写W,\w的反义,非数字字母字符
\s 小写s,匹配任何空白符,[\n\t\r\v\f]
\S 大写S,\s的反义
\b 匹配单词边界
\B \b的反义
\ 反义符,当匹配特殊符号的原始字符时( . , * , $ , ^ , ? ),通过反义取消它的特殊含义
r' ' raw string,原始字符串,当特殊字符在Ascii和正则表达式中存在歧义时,使用原始字符串可消除Ascii中的特殊含义,让re正确识别。如\b在Ascii中表示退格,在re中表示单词边界,r'\b'可表示单词边界。
上一篇 下一篇

猜你喜欢

热点阅读