正则表达式
python关于正则的支持
- 提供内置模块
re
-
fullmatch(正则表达式, 字符串)
- 判断字符串是否正则表达式的规则
具体内容
表示方法 | 解析 |
---|---|
.(点) | 匹配任意一个字符 |
\w | 匹配一个字母a-zA-Z、数字0-9或下划线_ |
\s | 匹配一个空白字符(空格、制表符\t、换行符\r和回车\n) |
\d | 匹配一个数字字符0-9 |
\b | 检测是否是单词边界(单词的开始、结尾、单词和单词之间的字符、空白) |
^ | 检测字符串是否以指定的正则表达式开头 |
$ | 检测字符串是否以指定的正则表达式结束 |
\W | 匹配一个非字母、数字或下划线的字符 |
\S | 匹配一个非空白字符 |
\D | 匹配一个非数字字符 |
\B | 检测一个非单词边界 |
匹配次数 | 解析** |
[] | 匹配括号中出现的任意字符,一个中括号中匹配一个字符 |
-(负号) | 在正则表达式的中括号里应用,两边的字符是对应的unicode码(含ASCII码)对应的字符 |
[^字符集] | 匹配不再[]中出现的任意一个字符 |
* | 可以匹配0次或多次字符(其前面的字符) |
+ | 可以匹配1次或多次字符(前面) |
? | 可以匹配0次或1次 |
{N} | 匹配N次字符 |
{N,} | 最少匹配N次 |
{,N} | 最多匹配N次 |
{M,N} | 可匹配最少M次,最多N次 |
注意 | 次数相关的操作,都是约束次数符号的前一个的字符 |
分支和分组
-
|
分支(相当于逻辑运算的or)
a3str = r'[a-zA-Z]{3}|\d{3}' #三个字母或数字
print(fullmatch(a3str,'123'))
print(fullmatch(a3str,'abc'))
a3str = r'\d{3}[a-z]{3}|[A-Z]{6}' #|左右分成两部分,即123abc或ASDQWE均成立
# 含分支操作时,只要有一个符合条件就不再使用后续的其他条件
a4str = 'abc12.5hhh60,30.2kkk9nn0.12'
print(findall('\d+[.]\d+|[1-9]\d+',a4str))
result;
<_sre.SRE_Match object; span=(0, 3), match='123'>
<_sre.SRE_Match object; span=(0, 3), match='abc'>
['12.5', '60', '30.2', '0.12']
- 分组
1.通过()
对正则表达式进行分组操作
a4str = r'([a-z]{2}\d{2}){3}' #两个字母两个数字连续出现3次
print(fullmatch(a4str,'ad13ad12as32'))
result:
<_sre.SRE_Match object; span=(0, 12), match='ad13ad12as32'>
2.重复,可以通过 \
数字 来重复一次前面括号中匹配的结果,数字的值代表前面的第几个分组
a4str = r'(\d{2}[a-z])(\d{3})\1'
print(fullmatch(a4str,'12q55512q'))
result:
<_sre.SRE_Match object; span=(0, 9), match='12q55512q'>
3.捕获,按照完整的正则表达式去匹配,去捕获()中的内容。只有在findall中有效
a4str = r'a(\d{3})b'
print(findall(a4str,'da124bob341a'))
result:
['124']
正则表达式的转义
- 正则表达式的转义和字符串的转义没有任何关系,在Python中字符串前加r阻止的是字符串的转义,不能阻止正则表达式的转义
- 在正则表达式中,可以通过在有特殊意义的符号前加\来表示符号本身
如: \+ \- \. \* \? \\(\本身) \( \) \^ \$ \|
注意:
a. - 只有在中括号里的两个字符之间才有特殊的意义
b. 如果特殊符号放到[]作为字符集的内容,那么除了-在两个字符间以外其他不需要转义
c. \ 不管放在何处都需要转义, ^放在中括号里的最前面需要转义(转义后就是单纯的字符)
- 例子
a2tr = r'[abc\\]{3}'
print(fullmatch(a2tr,'\\ac'))
print(fullmatch(a2tr,r'\ac'))
result:(\\ 与 前r效果一样)
<_sre.SRE_Match object; span=(0, 3), match='\\ac'>
<_sre.SRE_Match object; span=(0, 3), match='\\ac'>
re 模块
-
compile(正则表达式)
- 将正则表达式转换成正则表达式对象
re_str = r'\d+'
re_object = re.compile(re_str)
print(re_object,type(re_object))
# 不转换成正则表达式对象,调用函数
re.fullmatch(re_str,'123asd')
# 转换成正则表达式,调用函数
re_object.fullmatch('123asd')
result:
re.compile('\\d+') <class '_sre.SRE_Pattern'>
-
match(正则表达式, 字符串)
--只判断字符串的开头是否能够和正则表达式匹配 -
fullmatch(正则表达式, 字符串)
--判断整个字符串是否能够和正则表达式匹配
# 返回值都是匹配结果,如果匹配成功返回匹配对象,否则返回None
re_str = r'abc\d{3}'
match = re.match(re_str,'abc123456')
match2 = re.fullmatch(re_str,'abc123')
# a.匹配到的范围。匹配结果字符单位下标范围
print(match.span(),match2.span())
#获取起点和终点
print(match.start(),match.end())
# 正则表达式有分组时,span()函数中的group参数指定特定分组相应的结果
re_str = r'(\d{3})\+([a-z]{3})'
match1 = re.match(re_str,'123+qwe001')
print(match1,match1.span(),match1.span(1),match1.span(2))
# b.获取匹配结果对应的字符串
print(match1.group(),match1.group(1),match1.group(2))
# c.获取被匹配的原字符串
print(match1.string)
result:
(0, 6) (0, 6)
0 6
<_sre.SRE_Match object; span=(0, 7), match='123+qwe'> (0, 7) (0, 3) (4, 7)
123+qwe 123 qwe
123+qwe001
-
search(正则表达式, 字符串)
-在字符串中查找第一个满足正则表达式的子串,若找到返回匹配对象,否则返回None
search1 = re.search(r'\d+Zz','hello my son,5Zz')
print(search1)
result:
<_sre.SRE_Match object; span=(13, 16), match='5Zz'>
-
split(正则表达式, 字符串)
- 按满足正则表达式的子串去切割字符串,返回列表
str2 = '锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。'
result = re.split(r'[,,。.]',str2)
result2 = re.split(r'\W',str2)
print(result[:-1])
print(result2)#中文的输入也在\w以内
result:
['锄禾日当午', '汗滴禾下土', '谁知盘中餐', '粒粒皆辛苦']
['锄禾日当午', '汗滴禾下土', '谁知盘中餐', '粒粒皆辛苦', '']
- sub(正则表达式,替换字符串,被替换的字符串)
word = '你丫是傻逼吗?我操死你大爷。挂机死全家'
result3 = re.sub(r'傻逼|操|死|挂机','?',word)
print(result3)
result:
你丫是?吗?我??你大爷。??全家
-
findall(正则表达式, 字符串)
- 获取字符串中所有满足正则表达式的子串,返回值是列表。注意: 分组中的捕获效果在findall中有效
result4 = re.findall(r'\d([a-z]+)','对滴2abc光明0iop')
print(result4)
result:
['abc', 'iop']