如何在Python的re.finditer方法中提取span属性?
提取re.finditer匹配结果的span值问题
问题场景
使用re.finditer获取匹配结果后,尝试提取每个匹配的span范围时,直接使用i.span得到的是函数对象列表:
[i.span for i in results] # 输出: # [<function Match.span(group=0, /)>, ...]
而期望得到的是类似(0,10)、(12,18)这样的元组值。
原因与解决方法
span是re.Match对象的方法,不是属性。你需要调用这个方法(加上括号())才能获取到实际的span元组:
# 正确写法 [i.span() for i in results]
如果需要指定匹配组的span(默认是组0,即整个匹配),可以给span()传组号,比如i.span(1)。
结合你的函数使用示例
用你定义的convert_ftn_to_token函数,完整的提取span代码如下:
import re def convert_ftn_to_token(seq): va = '[a-z]{1,}' ftn_lst = ['sin','cos','tan','log_', 'e ?\^'] ftn_lst = [ftn + ' ?\{? ?' + va +' ?\}?' for ftn in ftn_lst] ftn_lst2 = [chr(i) for i in range(65,91)] + [chr(i) for i in range(97,123)] ftn_lst2 = [ftn + ' ?\( ?' + va + ' ?\)' for ftn in ftn_lst2] ftn_c = re.compile( '|'.join(ftn_lst2) +'|'+ '|'.join(ftn_lst) ) return re.finditer(ftn_c,seq) # 测试示例 test_seq = "sin theta cos x e ^ x f( x ) log_ {x}" results = convert_ftn_to_token(test_seq) spans = [i.span() for i in results] print(spans) # 输出:[(0, 10), (12, 18), (20, 26), (26, 32), (37, 45)]
内容的提问来源于stack exchange,提问作者junsu lee
相关产品推荐
相关产品推荐

