|
发表于 2020-7-6 01:07:52
|
显示全部楼层
你不能 用 \w+ 来匹配这些断言的字符,因为 \w+本身就是匹配一次或者多次,而且默认还是贪婪模式
举个例子,假设就是匹配你这里的字符 不匹配带 ing
"cooking ,we ,doing"
那么因为先匹配的是\w+ 所以这个时候 \w+ 因为默认是贪婪,所以会先匹配到 cooking 后面的空格\w+匹配结束,然后判断 cooking 字符串后面是不是 ing ,而 cooking 字符串后面是空格 所以符合条件成功匹配
这样就和我们所想的就不一样,因为 \w+ 默认是一直匹配字母直到遇到其他字符
所以你这里的 ['cooking', 'we', 'doing'] 这个结果完全是 \w+ 匹配的,而且每次一定会把连续的英文字母匹配进去,所以肯定会满足 (?!ing) 断言,即始终满足字符后面不是 ing
再举个例子吧,这种感情确实有点拗口:
- import re
- s = "cooking ,we ,doing"
- print(re.findall(r"\w{2}(?!ing)",s))
复制代码
这个代码的运行结果:
- ['co', 'ki', 'ng', 'we', 'oi', 'ng']
复制代码
有没发现,我们没有匹配到 ok 字符,就是因为我们是设置 (?!ing) , 当我们 \w 匹配两次到 ok 的时候判断了 (?!ing) 导致不匹配 ok,而匹配到 ki 的时候 后面的字符串是 'ng ' 而不是 ing 所以成功匹配
你好好理解理解,就是 \w+ 的问题,你如果直接明确是什么,那就好多了:
- import re
- s = "coweing ,we ,weing"
- print(re.findall(r"we(?!ing)",s))
复制代码
输出结果:
- ['we'] # 这里的 weing 就没有成功匹配出来
复制代码
|
|