我不确定你原来的正则表达式是否能满足你的要求。
很抱歉我来晚了。但其他人可能也会觉得这很有用。import re
p = r"AAAA(?=\s\w+)" #revised per comment from @Jerry
p2 =r"\w+ AAAA \w+"
s = "foo bar AAAA foo2 AAAA bar2"
l = re.findall(p, s)
l2 = re.findall(p2, s)
print('l: {l}'.format(l=l))
#print(f'l: {l}') is nicer, but online interpreters sometimes don't support it.
# https://www.onlinegdb.com/online_python_interpreter
#I'm using Python 3.
print('l2: {l}'.format(l=l2))
for m in re.finditer(p, s):
print(m.span())
#A span of (n,m) would really represent characters n to m-1 with zero based index
#So.(8,12):
# => (8,11: 0 based index)
# => (9th to 12th characters conventional 1 based index)
print(re.findall(p, s)[-1])
输出:l: ['AAAA', 'AAAA']
l2: ['bar AAAA foo2']
(8, 12)
(18, 22)
AAAA
这里得到两个结果而不是原来的结果的原因是(?=)特殊的调味汁。
它被称为“积极展望”。
当在regex求值过程中找到匹配项时,它不会“使用”(即向前移动光标)。所以,匹配后就回来了。
尽管正的lookahead在括号中,但它们也充当一个非捕获组。
因此,尽管模式是匹配的,但结果忽略了由\w+和中间空格\s表示的字母数字字符的周围序列——表示[ \t\n\r\f\v]。(更多here)
所以我每次都只回AAAA。
p2这里,代表了@SDD代码的原始模式,提出问题的人。
foo2使用了该模式,因此当regex引擎重新开始其第二次匹配迭代时,第二个AAAA将不匹配,因为光标前进得太远。
如果你想更深入地挖掘,我建议看一下Moondra的Youtube视频。
他对Python正则表达式做了一个非常全面的17部分系列,从here开始
这是一个在线Python解释器的link。