相关疑难解决方法(0)

带有反向引用的不可能的背后隐藏

根据我的理解,

(.)(?<!\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中所述.

python regex python-2.7 python-3.x

12
推荐指数
1
解决办法
522
查看次数

正则表达式匹配单个新行.正则表达式匹配双新线

我正在尝试构造一个匹配单独换行符(\n)的正则表达式.

类似地,我需要另一个正则表达式来匹配双换行符(\n\n),这些换行符不是较长的换行符\n\n\n或类似行\n\n\n\n\n\n等的一部分.

\n(?!\n)\n\n(?!\n)匹配太多(它们与较长的换行序列中的最后一个换行符相匹配).我该怎么做?

javascript regex

11
推荐指数
2
解决办法
6927
查看次数

regexp用于提取年份

给定一个字符串,如何提取正好 4位数的所有序列?

也就是说,因为1234 12 12345 1bc5 9876我想得到[1234, 9876].

我得到了re.findall('\D\d\d\d\d\D'),但是在文本边界上失败(当比赛之前/之后没有角色).


解决方案最好使用Python 2.7,但我想这很普遍,任何语言都可以.

python regex

1
推荐指数
1
解决办法
68
查看次数

标签 统计

regex ×3

python ×2

javascript ×1

python-2.7 ×1

python-3.x ×1