python - 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 个替换)。
现在我知道我的正则表达式可能完全是废话,但我想知道我到底需要做什么才能完成这项工作,以及我需要在代码中的什么位置添加/删除/更改内容。欢迎任何建议/提示!
解决方案
现在,您只需将限制添加到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''+
是多余的,对最终模式没有影响。
推荐阅读
- python - 如何比较两个数据框,并添加两者之一没有的行和列
- r - 为数据中的每个变量创建图(所有变量都是分类的)
- java - 如何修改实体管理器的查询缓存?
- python - 调用实例或类方法,以适当者为准
- node.js - NodeJS中的打字稿类
- mysql - MySQL 查询导致 Windows MySQL 服务停止运行
- python - 检查列表中的多个条件(循环)
- asp.net - NHibernate QueryOver - 进行 Fetches 和 OrderBy -> 使用什么语法?
- python-3.x - 根据 col_z 信息从数据表(col_x 和 col_y)中获取 matplotlib 中的多个子图
- linux - 计算具有不同加权百分比的成绩并在 bash 中输出最终成绩