Python 内置模块之 re 正则表达式
>>> import re
正则表达式的构成
- 普通字符:数字、字母
- 转义字符:\
\s 匹配任何空白字符
- \S 匹配任何非空白字符
- \d 匹配数字
- \D 匹配任何非数字字符
- \w 匹配字母或数字或下划线或汉字
- \W 匹配任何非字母数字字符
- 通配符
- . : 表示除换行符以外的任意字符。
- [ ] : 表示一个字符域。 [0-9][a-zA-Z]
- 修饰符 (对前面的字符进行修饰)
- ?:表示0个或1个前面的字符
- *: 表示0个或多个前面的字符。.* 表示任意字符
- +: 表示1个或多个前面的字符
- {n}:表示n个前面的字符。
- {n,}: 表示n或大于n个前面的字符。
- {n, m}:表示n个到m个前面的字符。
- 其他
- ^ 表示以什么开头行
- $ 表示以什么结尾的行
- | 表示“或” 。 如 'f(oo|ee)l' 匹配 fool 或 feel
- () 表示一个字符集。? * + 等默认只能修饰前面一个字符,利用()可以实现多个字符分组
- (?P<name>...) 为分组定义key
正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。可以使用Python的r
前缀,匹配文本中的字符"\",而不用'\\'表示反斜杠
如 r'\d' 就表示'\d' 而不是数字,这样写出来的表达式更直观。
操作方法
- re.match(pattern, string, flags=0) 从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
- re.search(pattern, string, flags=0) 浏览整个字符串去匹配第一个,未匹配成功返回None
- re.findall(pattern, string, flags=0) 把所有匹配到的字符放到以列表中的元素返回
re.sub(pattern, repl, string, count
=
0
, flags
=
0
) 替换匹配成功的指定位置字符串
re.split(pattern, string, maxsplit
=
0
, flags
=
0
)
根据正则匹配分割字符串
flags 常用匹配模式
flags=re.I (re.IGNORECASE): 忽略大小写
flags=
re.M (re.MULTILINE): 多行模式,改变
'^'
和
'$'
的行为,默认
'^'
和
'$'
是以单行模式匹配
flags=
re.S (re.DOTALL): 改变'.'
的行为,定义该模式后'.'表示包括换行符的任意字符
匹配返回的对象操作
- r.group() # 获取匹配到的所有结果
- r.groups() # 获取模型中匹配到的分组结果
- r.groupdict() # 获取模型中匹配到的分组中所有执行了key的组
>>> re.match('h\w+','hello world!')
<_sre.SRE_Match object; span=(0, 5), match='hello'>
>>> re.match('hello','Hello world',flags=re.IGNORECASE)
<_sre.SRE_Match object; span=(0, 5), match='Hello'>
>>> re.search('o$','\nhello\nworld',flags=re.MULTILINE)
<_sre.SRE_Match object; span=(5, 6), match='o'>
>>> re.search('^w.*','\nhello\nworld',flags=re.MULTILINE)
<_sre.SRE_Match object; span=(7, 12), match='world'>
>>> re.search('.*','hello\nworld')
<_sre.SRE_Match object; span=(0, 5), match='hello'>
>>> re.search('.*','hello\nworld',flags=re.DOTALL)
<_sre.SRE_Match object; span=(0, 11), match='hello\nworld'>
>>> re.findall('\W','test@163.com')
['@', '.']
>>> re.findall('(\w+).(\w+).(\w+)','test@163.com')
[('test', '163', 'com')] # 注意返回的列表里是元组
>>> re.sub('^\w{4}','boy','girlfriend')
'boyfriend'
>>>re.split('\W','test@163.com')
['test', '163', 'com']
>>> r=re.search('(\w+)-(\w+)','linux-Python3')
>>> r.group()
'linux-Python3'
>>> r.groups()
('linux', 'Python3')
>>> r.group(1)
'linux'
>>> r.group(2)
'Python3'
>>> r=re.search('(?P<platform>\w+)-(?P<version>\w+\d)','linux-Python3')
>>> r.groupdict()
{'platform': 'linux', 'version': 'Python3'}