Python 正则表达式后视不一致?
Python regex lookbehind inconsistency?
当我运行以下代码时:
重新导入
s = 'baaaad'
l = re.findall(r'((a)(?=a))', s)
print l
for elem in l:
print ''.join(elem)
我得到输出:
[('a', 'a'), ('a', 'a'), ('a', 'a')]
一个
一个
一个
符合预期。但是当我尝试相应的后视策略时,即:
s = 'baaaad'
l = re.findall(r'((?<=b)(a))', s)
print l
for elem in l:
print ''.join(elem)
我得到:
[('a', 'a')]
一个
我期待得到:
[('b', 'a')]
巴
为什么这是(对我来说)意想不到的行为?如果我做错了什么,那是什么?以及如何修复它?
谢谢!
您似乎认为输出中的一组来自 (a)
,而另一组来自前瞻或后视。事实并非如此。其中一组是 (a)
,另一组来自整个正则表达式的括号:
v v not these
((?<=b)(a))
^ ^ these
先行 不 匹配 a
,后行 不 匹配 b
。它们匹配 position 之后出现 a
或之前出现 b
的字符串。它们不匹配任何实际字符。因此,您的两个正则表达式都只匹配 a
,对之前或之后可能出现的内容有限制,并且两个正则表达式中的两个捕获组都只捕获 a
.
当我运行以下代码时:
重新导入
s = 'baaaad'
l = re.findall(r'((a)(?=a))', s)
print l
for elem in l:
print ''.join(elem)
我得到输出:
[('a', 'a'), ('a', 'a'), ('a', 'a')] 一个 一个 一个
符合预期。但是当我尝试相应的后视策略时,即:
s = 'baaaad'
l = re.findall(r'((?<=b)(a))', s)
print l
for elem in l:
print ''.join(elem)
我得到:
[('a', 'a')] 一个
我期待得到:
[('b', 'a')] 巴
为什么这是(对我来说)意想不到的行为?如果我做错了什么,那是什么?以及如何修复它?
谢谢!
您似乎认为输出中的一组来自 (a)
,而另一组来自前瞻或后视。事实并非如此。其中一组是 (a)
,另一组来自整个正则表达式的括号:
v v not these
((?<=b)(a))
^ ^ these
先行 不 匹配 a
,后行 不 匹配 b
。它们匹配 position 之后出现 a
或之前出现 b
的字符串。它们不匹配任何实际字符。因此,您的两个正则表达式都只匹配 a
,对之前或之后可能出现的内容有限制,并且两个正则表达式中的两个捕获组都只捕获 a
.