【问题标题】:Regex: Capturing flanked characters [duplicate]正则表达式:捕获侧面字符[重复]
【发布时间】:2020-08-08 04:18:14
【问题描述】:

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

我遇到的问题是当Y 两侧有G 时:基本上我的正则表达式无法正确捕获GY GYG 中的YG

这是我目前的代码:

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 模块支持重叠匹配。
  • 只需将 (?=(YG|GY)) 与 findall 一起使用
  • 请参阅 this 以获取同样为您提供索引的 finditer 替代方案
  • 感谢所有提示!我不知道“重叠匹配”是一回事..

标签: python regex string search


【解决方案1】:

您可以使用较新的 regex 模块(或使用环视):

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)

【讨论】:

    【解决方案2】:

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

    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 需要进行完全匹配。这避免了消耗第二个字母的问题,该字母也可能是另一个后续匹配的第一个字母。然后,我们获取那些代表完整匹配的单字母匹配,并使用列表推导来构建原始的重叠匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 2017-09-13
      • 2011-03-11
      • 2017-01-07
      • 2019-12-19
      相关资源
      最近更新 更多