根据我的理解,
(.)(?<!\1)
Run Code Online (Sandbox Code Playgroud)
永远不应该匹配.实际上,php preg_replace甚至拒绝编译这个,所以ruby也是如此gsub.python re模块似乎有不同的意见:
import re
test = 'xAAAAAyBBBBz'
print (re.sub(r'(.)(?<!\1)', r'(\g<0>)', test))
Run Code Online (Sandbox Code Playgroud)
结果:
(x)AAAA(A)(y)BBB(B)(z)
Run Code Online (Sandbox Code Playgroud)
任何人都可以为这种行为提供合理的解释吗?
这种行为似乎是限制了在re模块.替代regex模块似乎正确处理断言中的组:
import regex
test = 'xAAAAAyBBBBz'
print (regex.sub(r'(.)(?<!\1)', r'(\g<0>)', test))
## xAAAAAyBBBBz
print (regex.sub(r'(.)(.)(?<!\1)', r'(\g<0>)', test))
## (xA)AAA(Ay)BBB(Bz)
Run Code Online (Sandbox Code Playgroud)
请注意,不同的是pcre,regex还允许可变宽度的lookbehinds:
print (regex.sub(r'(.)(?<![A-Z]+)', r'(\g<0>)', test))
## (x)AAAAA(y)BBBB(z)
Run Code Online (Sandbox Code Playgroud)
最终,regex将被包含在标准库中,如PEP 411中所述.
我正在尝试构造一个匹配单独换行符(\n)的正则表达式.
类似地,我需要另一个正则表达式来匹配双换行符(\n\n),这些换行符不是较长的换行符\n\n\n或类似行\n\n\n\n\n\n等的一部分.
\n(?!\n)并\n\n(?!\n)匹配太多(它们与较长的换行序列中的最后一个换行符相匹配).我该怎么做?
给定一个字符串,如何提取正好 4位数的所有序列?
也就是说,因为1234 12 12345 1bc5 9876我想得到[1234, 9876].
我得到了re.findall('\D\d\d\d\d\D'),但是在文本边界上失败(当比赛之前/之后没有角色).
解决方案最好使用Python 2.7,但我想这很普遍,任何语言都可以.