如何利用Python re模块获取字符串中所有相同单词的Span ID?
获取正则匹配中所有目标的Span ID
哦,这个问题我太熟悉了!re.search()的设计就是只返回第一个匹配到的结果,所以你只能拿到第一个"Jhon"的位置信息。想要获取所有匹配项的Span ID,咱们可以用下面这个最直接的方法:
使用re.finditer()遍历所有匹配
re.finditer()会返回一个迭代器,其中每个元素都是一个匹配对象(和re.search()返回的类型完全一致),我们只需要遍历这个迭代器,就能逐个取出每个匹配的Span信息了。
示例代码:
import re string2 = "Jhon is a good boy,Jhon is brilliant,Jhon is a data scientist,Jhon is Jhon" # 获取所有匹配的迭代器 match_iter = re.finditer("Jhon", string2) # 遍历每个匹配对象,顺便给匹配项加个序号 for idx, match in enumerate(match_iter, 1): print(f"第{idx}个匹配: 内容='{match.group()}', Span ID={match.span()}")
执行这段代码后,你会得到所有"Jhon"的位置:
第1个匹配: 内容='Jhon', Span ID=(0, 4) 第2个匹配: 内容='Jhon', Span ID=(18, 22) 第3个匹配: 内容='Jhon', Span ID=(36, 40) 第4个匹配: 内容='Jhon', Span ID=(57, 61) 第5个匹配: 内容='Jhon', Span ID=(65, 69)
补充说明
- 为什么不用
re.findall()?因为re.findall()只会返回所有匹配的字符串内容,没法直接拿到Span位置信息,所以如果需要位置,re.finditer()是更合适的选择。 - 正则匹配默认是非重叠匹配的,也就是说如果有像"JhonJhon"这样的字符串,它只会匹配两个独立的"Jhon"(如果你的正则是"Jhon"的话),不会出现重叠的匹配结果。
内容的提问来源于stack exchange,提问作者Amarjeet Ranasingh
相关产品推荐
相关产品推荐

