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'可表示单词边界。 |
网友评论