import re
string1 = "aaabaa"
zusuchen = "aa"
#1
m_start = re.finditer(fr'(?=({zusuchen}))', string1)
results = [(match.start(1), match.end(1)-1) for match in m_start]
for z in results:
print(z)
print("Now #2:")
#2
m_start = re.finditer(fr'(?={zusuchen})', string1)
results = [(match.start(), match.end()-1) for match in m_start]
for z in results:
print(z)
我仍然没有弄清楚#2 的问题是什么。 我认为输出应该是相同的
但是我得到的输出: (0, 1) (1, 2) (4, 5) 现在#2: (0, -1) (1, 0) (4, 3)
这两个代码段的输出之所以不同,是因为正则表达式中的捕获组以及
finditer
函数的工作方式不同。
让我们来分析一下两段代码:
代码段 1:
m_start = re.finditer(fr'(?=({zusuchen}))', string1)
results = [(match.start(1), match.end(1)-1) for match in m_start]
-
正则表达式
fr'(?=({zusuchen}))'
使用了两个组:-
外层组
(?=...)
是一个非捕获组,它使用先行断言(?=...)
来查找zusuchen
(即 "aa")出现的位置,但不包含匹配的字符本身。 -
内层组
({zusuchen})
是一个捕获组,它捕获了实际匹配zusuchen
的字符。
-
外层组
-
match.start(1)
和match.end(1)
获取的是 内层捕获组 的起始和结束位置。
因此,代码段 1 输出的是 "aa" 在字符串中出现的位置,即 (0, 1), (1, 2), (4, 5)。
代码段 2:
m_start = re.finditer(fr'(?={zusuchen})', string1)
results = [(match.start(), match.end()-1) for match in m_start]
-
正则表达式
fr'(?={zusuchen})'
只使用了一个非捕获组(?=...)
,它同样使用先行断言查找zusuchen
出现的位置,但没有捕获任何字符。 -
match.start()
和match.end()
获取的是 整个匹配 的起始和结束位置。由于没有捕获组,所以返回的是先行断言匹配成功的位置。
由于先行断言匹配的是一个
零宽度的位置
(即 "aa" 出现之前的位置),所以
match.end()
返回的是与
match.start()
相同的值。因此,代码段 2 输出的是 "aa" 出现之前的
位置索引
,即 (0, -1), (1, 0), (4, 3)。
总结:
- 代码段 1 使用了捕获组,所以返回的是匹配的字符 "aa" 的位置。
- 代码段 2 只使用了非捕获组,所以返回的是 "aa" 出现之前的 位置索引 。
希望这个解释能够帮助你理解两个代码段输出不同的原因。
标签:python,python-3.x,regex From: 78795195