Python re模块 正则表达式(3)

>>> re.subn(r"\d+", "$", "aaabbccc")
('aaabbccc', 0)
>>> re.subn(r"\d+", "$", "aaa11bb22ccc")
('aaa$bb$ccc', 2)
>>> re.subn(r"\d+", "$", "aaa11bb22ccc", 1)  # 最多替换1次
('aaa$bb22ccc', 1)
>>> re.subn(r"\d+", "$", "aaa11bb22ccc", 10)  # 最多替换10次
('aaa$bb$ccc', 2)  # 成功替换2次

7)re.split(pattern, string, maxsplit=0, flags=0)

通过给定规则,将string进行切割,maxsplit最多切割次数,maxsplit=0默认全部切割,返回切割结果的字符串列表

1 >>> re.split(r"@", "a#b#c#d#e")  # 没有找到"@",不切割
2 ['a#b#c#d#e']
3 >>> re.split(r"#", "a#b#c#d#e")  # 按"#"对字符串进行切割
4 ['a', 'b', 'c', 'd', 'e']
5 >>> re.split(r"#", "a#b#c#d#e", 2)  # 按"#"对字符串进行切割,最多切割2次
6 ['a', 'b', 'c#d#e']

8)re.compile(pattern, flags=0)

返回一个正则表达式的对象

1 >>> rg = re.compile(r"\d+", flags=0)
2 >>> re.findall(rg, "a1bb22ccc333")
3 ['1', '22', '333']

4、注意事项

1)"r" 原生字符串的使用,在字符串前加 "r" 或 "R" 表示这个字符串为原生字符串,即所有的字符都表示普通字符,无特殊字符,常在正则、路径中应用

>>> print(r"aa\nbb")
aa\nbb
>>> print(len(r"aa\nbb"))
6
>>> print("aa\nbb")
aa
bb
>>> print(len("aa\nbb"))
5

可以看到第四行,字符串长度为"6" ,即 "\" "n" 是两个字符。

第6、7行输出了两行,第9行字符串长度"5",说明 "\n"  是一个换行符

2)例子:如果需要匹配 "\" 该如何写正则表达式(重点)

>>> re.findall(r"aa\\", r"aa\bb")
['aa\\']
>>> re.findall("aa\\", r"aa\bb")
Traceback (most recent call last):
  # 报错内容····太多,就这样显示就好
>>> re.findall("aa\\\\", r"aa\bb")
['aa\\']
>>> print(len(re.findall(r"aa\\", r"aa\bb")[0]))
3

在这里首先要说明一下,在python中,输出带引号的字符串中有 "\" 字符,是转义后看到的字符,即 "\\"

可以看到,在匹配带转义字符的正则表达式的中带 "r" 和不带 "r" 的写法有很大的区别

其中的原因是python解释器在解释字符串的时候会按自己的规则将字符串翻译了一便。

如第3行,"aa\\" 经过python 解释器翻译之后,已经变成了  r"aa\" 这样的原生字符串,传递给re模块的时候,re模块无法解析单个 "\" 转义字符,所以会报错。

如果要匹配  "\"  的普通字符,正则表达式需要写出 "\\" ,所以第6行传递的时候需要 4 个"\\\\" ,经过python解释之后,变成 r"\\" 就正确了。

综上所述,在写正则表达式的时候还是在前边加个 "r" 这样或许会避免很多的问题(个人建议,特别是在网上找的正则表达式)

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2ba7d088aa358a8b51971cc407691031.html