首页 > 解决方案 > 原子捕获组的逆

问题描述

在一个序列中,我想获得多个字符的位置,然后是这些字符之间的字符位置。

例如,在 中,我首先匹配并使用原子捕获条件的ABZYZABZAYAYABCYZA所有倍数。YZ

import regex as re 
seq = 'ABZYZABZAYAYABCYZA'
iter = re.finditer(r'Y|Z', seq)
dd = {}
for matchedobj in iter:
        dd[matchedobj.group()] = dd.get(matchedobj.group(),[]) + [matchedobj.start()]

这使

{'Y': [3, 9, 11, 15], 'Z': [2, 4, 7, 16]}

然后我想匹配连续Y或之间的所有整个空间Z。在这种情况下,输出匹配应该是

{'AB': [0, 5], 'A': [8, 10], 'ABC':[12]}

尝试使用非捕获条件:

iter = re.findter(r'\w*?(?:(Y|Z))', seq)

并环顾四周:

iter = re.finditer(r'[^YZ]\w+?(?=Y|Z)|(?<=Y|Z)\w+?(?=Y|Z)|(?<=Y|Z)\w+', seq)

两者都不能正常工作。

标签: pythonregex

解决方案


您的模式是X|Y匹配单个字符XY. 要反转它,您可以使用[^XY]并匹配任何 1+ 字符,您只需要附加+量词即可。

现在,您将匹配项保存到字典中,但您希望键名相同。这意味着,只会保存每个相同键的最后一个值。您需要一个元组列表,而不是字典。

利用

for matchedobj in re.finditer(r'[^YZ]+', seq): 
    dd.append((matchedobj.group(), matchedobj.start()))

输出;[('AB', 0), ('AB', 5), ('A', 8), ('A', 10), ('ABC', 12), ('A', 17)]


推荐阅读