首页 > 解决方案 > 正则表达式:捕获侧翼字符

问题描述

我正在尝试使用python 中的包匹配我的字符串中的所有GY或组合。我将所有这些匹配项放在一个字典中以供将来查找。YGQGYGQGYQQGre

我遇到的问题是当Y两边是G:基本上我的正则表达式不能同时捕获GY 正确捕获YGGYG

到目前为止,这是我的代码:

import re
seq = 'QYGQGYGQQG'
regex = re.compile('(GY|YG)|(?<=Y)G')
iterator = regex.finditer(seq)
dd = {}
for matchedobj in iterator: 
    dd[matchedobj.group()] = dd.get(matchedobj.group(), []) + [matchedobj.start()]

输出:

{'G': [6], 'GY': [4], 'YG': [1]}

标签: pythonregexstringsearch

解决方案


这是您可以使用的不依赖于重叠匹配的解决方案:

seq = 'QYGQGYGQQG'
matches = re.findall('G(?=Y)|Y(?=G)', seq)
print([re.sub(r'^Y', 'YG', x.replace('G', 'GY')) for x in matches])

这打印:

['YG', 'GY', 'YG']

这里的技巧是只匹配Gand Y,使用前瞻来断言接下来的内容是进行完全匹配的预期YG需要的。这避免了消耗第二个字母的问题,该字母也可能是另一个后续匹配的第一个字母。然后,我们采用那些代表完整匹配的单字母匹配,并使用列表推导来构建原始的重叠匹配。


推荐阅读