我正在努力匹配所有 GY
或 YG
我的字符串中的组合 QGYGQGYQQG
使用 re
包的python中。我把所有这些匹配的数据都放在一个dict中,以便将来查找。
我遇到的问题是当 Y
两旁是 G
: 基本上,我的regex不能同时捕获 GY
和 YG
在 GYG
正确。
这是我目前的代码。
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]}
你可以使用较新的 regex
模块(或使用lookarounds)。
import regex as re
seq = 'QYGQGYGQQG'
matches = re.findall(r'GY|YG', seq, overlapped=True)
print(matches)
# ['YG', 'GY', 'YG']
或者 - 用 re.finditer
:
for m in re.finditer(r'GY|YG', seq, overlapped=True):
print(m.span())
这将产生
(1, 3)
(4, 6)
(5, 7)
下面是一个不依赖重叠匹配的解决方案。
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']
这里的技巧是只匹配 G
和 Y
,使用前瞻来断言下面的内容是预期的 Y
或 G
所需的字母,以进行完整的匹配。 这就避免了消耗第二个字母的问题,而这个字母也可能是另一个后续匹配的第一个字母。 然后,我们将这些代表完整匹配的单字母匹配,使用列表理解法来建立原始的重叠匹配。