首页 > 解决方案 > Python 正则表达式模糊搜索

问题描述

我有一个关于使用模糊正则表达式和 pythonregex模块制作模式的问题。

我有几个字符串,例如 TCATGCACGTGGGGCTGAC

该字符串的前八个字符是可变的(多个选项):TCAGTGTG、TCATGCAC、TGGTGGCT。另外,在变量部分之后还有一个常量部分:GTGGGGCTGAC。

我想设计一个正则表达式,它可以在更长的字符串中检测到这个字符串,同时最多允许 2 次替换。

例如,这是可以接受的,因为两个字符已被替换:

TCATGCACGTGGGGCTGAC
TC C TGCACGTGG A GCTGAC

但是,不应接受更多的替换。

在我的代码中,我尝试执行以下操作:

import regex

variable_parts = ["TCAGTGTG", "TCATGCAC", "TGGTGGCT", "GATAAGTG", "ATTAGACG", "CACTTCCG", "GTCTGTAT", "TGTCAAAG"]
string_to_test = "TCATGCACGTGGGGCTGAC"
motif = "(%s)GTGGGGCTGAC" % "|".join(variable_parts)
pattern = regex.compile(r''+motif+'{s<=2}')

print(pattern.search(string_to_test))

当我运行此代码并更改string_to_test. 但是当我在 中间手动添加替换时string_to_test,我没有得到任何匹配(即使我想允许最多 2 个替换)。

现在我知道我的正则表达式可能完全是废话,但我想知道我到底需要做什么才能完成这项工作,以及我需要在代码中的什么位置添加/删除/更改内容。欢迎任何建议/提示!

标签: pythonregex

解决方案


现在,您只需将限制添加到C看起来像的模式中的最后一个(TCAGTGTG|TCATGCAC|TGGTGGCT|GATAAGTG|ATTAGACG|CACTTCCG|GTCTGTAT|TGTCAAAG)GTGGGGCTGAC{s<=2}

要将{s<=2}量词应用于整个表达式,您需要将模式包含在非捕获组中:

pattern = regex.compile(fr'(?:{motif}){{s<=2}}')

上面的例子展示了如何在 f 字符串文字的帮助下声明你的模式,其中文字大括号是用{{}}(双)大括号定义的。它产生与 相同的结果pattern = regex.compile('(?:'+motif+'){s<=2}')

另外,请注意这r''+是多余的,对最终模式没有影响。


推荐阅读