注册表。捕捉侧边字符[重复]

问题描述 投票:0回答:2

我正在努力匹配所有 GYYG 我的字符串中的组合 QGYGQGYQQG 使用 re 包的python中。我把所有这些匹配的数据都放在一个dict中,以便将来查找。

我遇到的问题是当 Y 两旁是 G: 基本上,我的regex不能同时捕获 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]}
python regex string search
2个回答
0
投票

你可以使用较新的 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)

0
投票

下面是一个不依赖重叠匹配的解决方案。

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']

这里的技巧是只匹配 GY,使用前瞻来断言下面的内容是预期的 YG 所需的字母,以进行完整的匹配。 这就避免了消耗第二个字母的问题,而这个字母也可能是另一个后续匹配的第一个字母。 然后,我们将这些代表完整匹配的单字母匹配,使用列表理解法来建立原始的重叠匹配。

© www.soinside.com 2019 - 2024. All rights reserved.