python之正则表达式

一、常用的匹配规则总结表

模式描述
w 匹配字母数字及下划线
W 匹配非字母数字及下划线
s 匹配任意空白字符,等价于 [ f].
S 匹配任意非空字符
d 匹配任意数字,等价于 [0-9]
D 匹配任意非数字
A 匹配字符串开始
 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
z 匹配字符串结束
G 匹配最后匹配完成的位置
匹配一个换行符
匹配一个制表符
^ 匹配字符串的开头
$ 匹配字符串的末尾
. 匹配任意字符,除了换行符
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m' 或 'k'
[^...] 不在 [] 中的字符:[^abc]匹配除了 a,b,c 之外的字符。
* 匹配 0 个或多个的表达式。
+ 匹配 1 个或多个的表达式。
? 匹配 0 个或 1 个由前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配 n 个前面表达式。
{n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a | b 匹配 a 或 b
( ) 匹配括号内的表达式,也表示一个组

相关具体应用例子,请见:Python-正则表达式


二、re库中常用方法

函数描述
re.match(pattern, string, flags=0) 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
re.search(pattern, string, flags=0) 扫描整个字符串并返回第一个成功的匹配
re.sub(pattern, repl, string, count=0) 用于替换字符串中的匹配项,repl : 替换的字符串,也可为一个函数
re.compile(pattern[, flags]) 用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用
findall(string[, pos[, endpos]]) 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
re.split(pattern, string[, maxsplit=0, flags=0]) 能够匹配的子串将字符串分割后返回列表

相关具体应用例子,请见:Python-正则表达式


三、修饰符总结

修饰符描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 w, W, , B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

四,基础匹配

'd' 可以匹配一个数字,'00d'可以匹配'007';
'w' 可以匹配一个字母或者数字,'00w'可以匹配'007'或者'00a';
's' 可以匹配一个空格;
'.'可以匹配任意字符;

匹配变长的字符,可以用*表示任意个字符(包括0个),用+表示至少一个字符,
用?表示0个或者1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符:
'd{3}-d{8}' → '020-61228080'
 

进阶

要做更精确的匹配,可以用[ ]表示范围,比加:
[0-9a-zA-Z\_] 可以匹配一个数字、字母或者下划线;
[0-9a-zA-Z\_]+ 可以匹配至少由一个数字、字母或者下划线组成的字符串;
[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符);

A|B可以匹配A或B,所以(P|p)ython可以匹配'python'或者'Python';
^表示行的开头,^d表示必须以数字开头;
$表示行的结束,d$表示必须以数字结束;
 

re模块

Python提供的re模块,包含所有正则表达式的功能。

由于Python的字符串本身也用转义,所以要注意:
s='ABC\-001'  表示正则字符串'ABC-001',但使用r前缀就不用考虑转义的问题了,r'ABC-001'。

match()方法判断是否匹配,匹配成功返回一个Match()对象,否则返回None。常用判断方法:

1
2
3
4
5
test = '用户输入的字符串'
if re.match(r'正则表达式', test):
    print('ok')
else:
    print('failed')

切割字符串

用正则表达式切分字符串比用固定的字符更灵活,请看正常的代码:

1
2
>>> 'a b   c'.split(' ')
['a''b', '', '', 'c']

上述方法无法识别连续的空格,用正则表达式试试:

1
2
>>> re.split(r's+''a b   c')
['a''b''c']
原文地址:https://www.cnblogs.com/wyj497022944/p/11429820.html