python - 正则表达式:捕获侧翼字符
问题描述
我正在尝试使用python 中的包匹配我的字符串中的所有GY
或组合。我将所有这些匹配项放在一个字典中以供将来查找。YG
QGYGQGYQQG
re
我遇到的问题是当Y
两边是G
:基本上我的正则表达式不能同时捕获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]}
解决方案
这是您可以使用的不依赖于重叠匹配的解决方案:
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
and Y
,使用前瞻来断言接下来的内容是进行完全匹配的预期Y
或G
需要的。这避免了消耗第二个字母的问题,该字母也可能是另一个后续匹配的第一个字母。然后,我们采用那些代表完整匹配的单字母匹配,并使用列表推导来构建原始的重叠匹配。
推荐阅读
- sql - 最新日期字段
- c# - 命名空间中不存在类型或命名空间名称“GetName”
- emacs - powerline 在 emacs + OSX 终端上仅显示实心绿色条
- windows - 如何解析和重新定义批处理文件中的变量?
- c# - 如何处理 NLog 的所有事件属性布局渲染器产生的空值?
- vuejs2 - 增量值在使用示例代码的 Firestore 中不起作用
- c - 使用 MPI 的分段错误
- swift - 在情节提要中使用视图控制器以使教学应用程序不超载内存的最佳方法是什么?
- google-cloud-platform - Spanner 的 CURRENT_TIMESTAMP() 是否保证永远不会倒退?
- c# - WinAppDriver:如何获取 ListView 控件的子列表