Python中re模块的使用

compile()

编译正则表达式,返回一个正则表达式对象,该对象可复用。

re.compile(pattern, flags=0)
# pattern:编译时用的表达式字符串
# flags:编译标志位,用于修改正则表达式匹配方式

常用flags

标志含义
re.S(DOTALL) 使 . 匹配包括换行符在内的所有字符
re.I(IGNORECASE) 忽略大小写
re.L(LOCALE) 本地化识别匹配,影响 \w, \W, \b, \B, \s, \S
re.M(MULTILINE) 多行匹配,影响^$
re.X(VERBOSE) 详细模式,该模式下正则表达式可以是多行,忽略空白字符,且可以加注释
re.U 根据Unicode字符集解析字符,影响\w, \W, \b, \B, \d, \D, \s, \S

match()

判断目标字符串是否在字符串开始处匹配。

re.match(pattern, string, flags=0)
# pattern:正则表达式对象
# string:目标字符串

用法:

re.match('hel', 'hello world').group()           # 'hel'
re.match('hel', 'HELLO WORLD', re.I).group()     # 'HEL'

注意:不完全匹配,即只判断字符串开头是否匹配。可以在正则表达式对象末尾加上边界符$来实现完全匹配。

search()

判断目标字符串是否在字符串中匹配,只要找到第一个匹配则返回,没有匹配则返回None

re.search(pattern, string, flags=0)
# pattern:正则表达式对象
# string:目标字符串

用法:

re.search('wor', 'hello world').group()        # wor
re.search('wor', 'HELLO WORLD', re.I).group()  # WOR

match() VS search()

相同:

  • 一旦匹配成功,会返回一个match object对象,该对象包含group等方法。

re.search('wor', 'hello world').start()   # 6
# 返回匹配开始处索引
re.search('wor', 'hello world').end()     # 9
# 返回匹配结束处索引
re.search('wor', 'hello world').span()    # (6, 9)
# 返回匹配开始、结束处索引组成的元组
re.search('wor', 'hello world').group()   # 'wor'
# 返回整体匹配的字符串,可以一次输入多个组号(正则表达式对象需要有进行分组)

不同:

  • match从字符串开始处匹配,开始处不匹配则匹配失败;search在字符串整体中进行匹配,只要找到一个匹配对象即返回匹配字符串。

findall()

遍历匹配,返回所有匹配的字符串组成的列表。

re.findall(pattern, string, flags=0)
# pattern:正则表达式对象
# string:目标字符串

用法:

re.findall('o', 'hello world')   # ['o', 'o']

finditer()

遍历匹配,返回一个匹配结果的迭代器。

re.finditer(pattern, string, flags=0)
# pattern:正则表达式对象
# string:目标字符串

用法:

res = re.finditer('o', 'hello world')
for i in res:
    print(i.group())
# o o

re.finditer()函数返回结果是一个迭代器,迭代对象为match object对象。

split()

根据匹配的字符串分割目标字符串,返回分割后结果列表。

re.split(pattern, string[, maxsplit[, flags=0]])
# pattern:正则表达式对象
# string:目标字符串
# maxsplit:最大分割次数,默认为无穷大即分割为最小块

用法:

re.split('o', 'hello world')
# ['hell', 'w', 'rld']
re.split('o', 'hello world', 1)
# ['hell', 'world']

sub()

替换给定字符串的匹配子串,返回替换后对象。

re.sub(pattern, repl, string, count)
# pattern:正则表达式对象
# repl:替换对象
# string:目标字符串
# count:替换次数,默认无穷大即全部替换

用法:

re.sub('o', 'p', 'hello world')    # hellp world
re.sub('o', 'p', 'hello world', 1) # hellp wprld

subn()

返回替换后结果和次数组成的元组。

re.subn(pattern, repl, string, count=0, flags=0)
# pattern:正则表达式对象
# repl:替换对象
# string:目标字符串
# count:替换次数,默认全部替换

用法:

re.subn('o','p', 'hello world')
# ('hellp wprld', 2)
re.subn('o','p', 'hello world', 1)
# ('hellp world', 1)
re.subn('o','p', 'hello world', 9)
# ('hellp wprld', 2)

Python支持的正则表达元字符和语法

语法说明表达式实例完整匹配的字符串
一般字符 匹配自身 abc abc
. 匹配除换行符\n之外所有字符,DOTALL模式也能匹配换行符 a.c agc
[...] 字符集。对应位置可以为字符集中任意字符,[]内可以是具体字符也可以是字符范围,如[abc][a-c]。第一个字符如果是^则表示取反。 a[bcd]e abe
       
\d 数字:[0-9] a\dc a2c
\D 非数字:[^\d] a\Dc abc
\s 空白字符:[<空格>\t\r\n\f\v] a\sc a c
\S 非空白字符:[^\s] a\Sc abc
\w 单词字符:[A-Za-z0-9] a\wc aBc
\W 非单词字符:[^\w] a\Wc a c
       
* 匹配前一个字符0次或多次 abc* ab,abccc
+ 匹配前一个字符1次或多次 abc+ abc,abccc
? 匹配前一个字符0次或1 abc? ab,abc
{m} 匹配前一个字符m ab{2}c abbc
{m, n} 匹配前一个字符mn ab{1,2}c abc,abbc
       
^ 匹配字符串开头,多行模式中匹配每一行开头 ^abc abc
$ 匹配字符串末尾,多行模式中匹配每一行末尾 abc$ abc
\A 仅匹配字符串开头 \Abc abc
\Z 仅匹配字符串末尾 abc\Z abc
\b 匹配\w\W 之间 a\b!ba a!bc
\B [^\b] a\Bbc abc
       
| 或操作符 abc|def abc,def
(...) 括号内表达式作为分组,从字符串起始开始匹配,每匹配到一个符合条件的则编号+1。分组表达式作为一个整体,可以后接数量词。 (abc){2},a(123|456)c abcabc,a456c
(?P<name>...) 分组,除原有编号之外再指定一个别名。 (?P<id>abc){2} abcabc
<number> 引用编号为<number>的分组匹配到的字符串 (\d)abc1 1abc1
(?P=name) 引用别名为<name>的分组匹配到的字符串 (?P<id>\d)abc(?P=id) 1abc1,3abc3
       
(?:...) (...)的不分组版本,用于使用或操作符后接数量词 (?:abc){2} abcabc
(?#...) #后内容作为注释被忽略 abc(#coment)1 abc1
(?=...) 之后的字符串内容需要匹配表达式才能成功匹配,不消耗字符串内容 a(?=\d) 后面是数字的a
(?!...)   a(?!\d) 后面不是数字的a
(?<=...)   a(<=\d) 前面是数字的a
(?<!...)   a(<!\d) 前面是不是数字的a

贪婪模式和非贪婪模式

使用正则表达式进行模式匹配的时候默认都是贪婪模式,即在匹配范围内尽可能匹配最大长度的字符串。贪婪模式会影响到*+{m, n}等元字符的使用,可以在后面加上?使其变为非贪婪模式。

re.search('abc.*d', 'abcdccccd')
# 贪婪模式,匹配整个字符串,输出 'abcdccccd'
re.search('abc.*?d', 'abcdccccd')
# 非贪婪模式,匹配到 abc 后面一个 d 即停止匹配,输出 'abcd'

  

posted @ 2019-08-29 23:51  Jeemzz  阅读(385)  评论(0编辑  收藏  举报