正则表达式:捕获侧面字符

2024-04-30 03:52:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我遇到的问题是当Y两边都是G时:基本上,我的正则表达式不能在GYG中同时捕获GY{}

这是我目前的代码:

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

Tags: 字符串代码importregroupseqdictdd
2条回答

您可以使用较新的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']

这里的诀窍是只匹配GY,使用前向断言接下来的内容是进行完全匹配所需的YG。这避免了使用第二个字母的问题,第二个字母也可能是另一个后续匹配的第一个字母。然后,我们采用表示完整匹配的单字母匹配,并使用列表理解来构建原始重叠匹配

相关问题 更多 >