[python] 正则表达式细节
1、零宽断言
所谓零宽断言就是并不去真正的匹配字符串文本,而仅仅是匹配对应的位置。
正则表达式中有很多这样的断言,常见的如匹配字符串或者行的起始位置 ^ 和 /A,匹配字符串或者行的末尾 $ 和 /Z,单词边界/B等等。这些简单的就不说了,今天主要说一下界定的使用方法。
表达式结构:
(?=exp) | 匹配exp前面的位置,即某表达式后面是exp |
(?<=exp) | 匹配exp后面的位置,即某表达式前面是exp |
(?!exp) | 匹配后面跟的不是exp的位置,即某表达式后面不是exp |
(?<!exp) | 匹配前面不是exp的位置,即某表达式前面不是exp |
(?<=<(\w+)>).*(?=<\/\1>) 匹配不包含属性的简单HTML标签内里的内容。
在Python3.7下测试:
import re str = "(?<=<(\w+)>).*(?=(<\/\1>))" re = re.compile(str)
error: look-behind requires fixed-width pattern
错误说明:前向界定括号中的表达式必须是常值,也就是不可以在前向界定的括号里写正则式。
建议:安装 regex 模块替代原有的 re,regex修正了re不少的bug,只要 import regex as re 就跟内置的re用法一样了
2、反斜杠的问题
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。
假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":
第一个和第三个用于在编程语言里将第二个和第四个转义成反斜杠,
转换成两个反斜杠\\后再在正则表达式里转义成一个反斜杠用来匹配反斜杠\。
这样显然是非常麻烦的。
Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。
同样,匹配一个数字的"\\d"可以写成r"\d"。
有了原生字符串,妈妈再也不用担心我的反斜杠问题~