Or as suggested by @anubhava, separate the lookbehind from the lookahead:Regex demo 我试图使用正则表达式查找一个子串的所有出现次数。子串由三部分组成,以一个或多个 "A "开头,然后是一个或多个 "N",最后是一个或多个 "A"。让一个字符串 'AAANAANABNA'
import regex as re
reg_a='A+N+A+'
s='AAANAANABNA'
sub_str=re.findall(reg_a,s,overlapped=True)
print(sub_str)
如果我解析这个字符串,我应该得到两个子字符串。
['AAANAA', 'AANAA', 'ANAA', 'AANA', 'ANA']
'AAANAA'
['AAANAA', 'AANA']
和
'AANA'但是,我希望输出为。A
也就是说,第一个匹配的尾部的A应该是下一个匹配的前导A.我怎么才能得到这个结果,有什么想法吗?
>>> reg_a='(?<!A)A+N+A+'
>>> print( re.findall(reg_a,s,overlapped=True) )
['AAANAA', 'AANA']
(?<!A)A+N+A+
(?<!A)
我试图使用正则表达式来查找一个子串的所有出现次数。子串由三部分组成,以一个或多个 "A "开头,后面是一个或多个 "N",最后是一个或 ...A
A+
确保没有 A
在左边。N+
The N
匹配A+
- 匹配的负面lookbehind的位置,而不是紧接在前面的 A
- 一个或多个 sre
- 一个或多个
>>> import re
>>> re_a = r'(?=(?<!A)(A+N+A+))'
>>> print( re.findall(re_a, s) )
['AAANAA', 'AANA']
s模块。我们只需要对1个以上的尾部的
(?=(?<!A)(A+N+A+))
(?=
并必须使用2个捕获组。(?<!A)
RegEx演示(A+N+A+)
)
有一种选择是在正向看头里面使用一个负向看头,有一个捕获组,但没有重叠。re.findall会返回捕获组的值。 正向看头,断言右边的东西就是 负向看齐,断定左边的不是A
import re
s = "AAANAANABNA"
pattern = r"(?=(?<!A)(A+N+A+))"
print(re.findall(pattern, s))
匹配你的图案
['AAANAA', 'AANA']
近距离观察Regex演示