Python 正则表达式模块即使重叠 = True 也找不到所有匹配项

2024-03-25

我正在使用 PyPy正则表达式模块 https://pypi.org/project/regex/具有重叠匹配支持。

我有以下代码,其中有一个字符串 A,我正在使用正则表达式查找在正则表达式中定义的 DNA 模式。我想找到与我的 RE 的所有匹配项,包括重叠的匹配项。正则表达式缺少其中一场比赛,我不知道如何修复它。

import regex as re
A = "GGGGAGAAGGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG"
GQ_list = re.findall(r"[G]{3,6}[ACTG]{1,33}[G]{3,6}[ACTG]{1,33}[G]{3,6}[ACTG]{1,33}[G]{3,6}", A, overlapped=True)

GQ_list 返回:

['GGGGAGAAGGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG',
 'GGGAGAAGGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG',
 'GGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG',
 'GGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG',
 'GGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG',
 'GGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG']

缺少这个"GGGGAGAAGGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGG" 这是我的字符串中的A并匹配正则表达式模式。这里有什么问题吗?我应该做出哪些更改才能获得所有可能的匹配(包括重叠的匹配)?


tdlr:在同一起始字符串索引处可能存在多个正则表达式匹配,re.findall或其他正则表达式方法只会为每个起始索引找到 1 个匹配项。你必须分解搜索才能找到全部......


您遇到的问题是正则表达式 findall 确实not找到每个索引的所有组合;它只找到one依次从每个索引进行匹配——通常是最长的匹配。查找重叠匹配的技术仍然会错过单个字符串索引中可能的多个匹配。你需要修改你的方法。

如果您检查您的正则表达式:

([G]{3,6}[ACTG]{1,33}[G]{3,6}[ACTG]{1,33}[G]{3,6}[ACTG]{1,33}[G]{3,6})

您会注意到匹配的序列必须以至少 3 个开头G并以相同的顺序结束。之间的顺序GGG[in_between_part]GGG短至 9 个字符,长至 84 个字符(并且可能包含相同的开始/结束序列'GGG''s).

我们可以使用该信息来查找符合该描述的所有可能的字符串序列。然后我们使用您的正则表达式来过滤所识别的序列确实是我们想要的序列。

首先找到每个可能的字符串索引'GGG'这是子字符串开始或结束的位置(根据定义):

s = "GGGGAGAAGGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG"

offset=0
indicies=[]
while (s_idx:=s[offset:].find('GGG'))>-1:
    indicies.append(s_idx+offset)
    offset+=s_idx+1

>>> indicies
[0, 1, 8, 9, 10, 11, 21, 47, 66]
# these are the indicies of 'GGG' that might be that start or end
# of a sub string of interest.

现在我们有了每个的起始索引'GGG'在你的字符串中。我们现在可以使用正则表达式和 bisect 模块来过滤正则表达式字符串中所有可能的匹配项。

我们正在使用bisect https://docs.python.org/3/library/bisect.html找到候选结束锚点的结束位置,该位置与开始锚点相同。 bisect 模块允许我们构造一个切片,该切片形成子字符串,a) 开头'GGG'(来自indicies列表)和 b)以'GGG'c) 起始锚点和结束锚点之间的长度在 9 到 84 个字符之间。然后我们使用重新完全匹配 https://docs.python.org/3/library/re.html#re.fullmatch确保候选子字符串完全匹配您的模式:

import re 
import bisect 

matches=[]  
min_len=3+9
max_len=3+84
pat=re.compile(r'([G]{3,6}[ACTG]{1,33}[G]{3,6}[ACTG]{1,33}[G]{3,6}[ACTG]{1,33}[G]{3,6})')
for x in indicies:
    min_offest=bisect.bisect(indicies,x+min_len)
    max_offset=bisect.bisect(indicies,x+max_len)
    for idx in indicies[min_offest:]+indicies[max_offset:]:
        candidate=s[x:idx+3]
        if pat.fullmatch(candidate):
            matches.append(candidate)

现在我们可以打印找到的所有匹配项,其索引位于s和长度:

>>> for ss in matches: print((s.index(ss), len(ss)),ss)
# This is only a primitive shortcut. If you want the actual
# index, save it when 'candidate' matches the regex

打印所有八个唯一匹配项,包括来自相同起始索引的匹配项:

(0, 50) GGGGAGAAGGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGG
(0, 69) GGGGAGAAGGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG
(1, 49) GGGAGAAGGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGG
(1, 68) GGGAGAAGGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG
(8, 61) GGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG
(9, 60) GGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG
(10, 59) GGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG
(11, 58) GGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGGTCCACAGCCACGGTTTGGG

Note:

正如评论中所述,正则表达式模块 https://pypi.org/project/regex/ does支持可变宽度lookbehind。

因此,您可能会想做:

m1=regex.findall(r'([G]{3,6}[ACTG]{1,33}[G]{3,6}[ACTG]{1,33}[G]{3,6}[ACTG]{1,33}[G]{3,6})', s, overlapped=True)     
# produces 6 unique matches 
m2=regex.findall(r'(?<=([G]{3,6}[ACTG]{1,33}[G]{3,6}[ACTG]{1,33}[G]{3,6}[ACTG]{1,33}[G]{3,6}))', s, overlapped=True)
# produces 2 matches, but one is a duplicate from m1

虽然此组合找到了 1 个额外的字符串,即您要查找的字符串,但它没有找到所有 8 个唯一匹配项。字符串GGGAGAAGGGGGGCCTTCCTGGGTCCCCGAGAGTGCAGACATGCCTGGG索引 1 处被遗漏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 正则表达式模块即使重叠 = True 也找不到所有匹配项 的相关文章

  • 如何使用 python、openCV 计算图像中的行数

    我想数纸张 所以我正在考虑使用线条检测 我尝试过一些方法 例如Canny HoughLines and FLD 但我只得到处理过的照片 我不知道如何计算 有一些小线段就是我们想要的线 我用过len lines or len contours
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 如何将脚本作为 pytest 测试运行

    假设我有一个用简单脚本表示的测试assert 陈述 请参阅背景了解原因 例如 import foo assert foo 3 4 我如何以一种好的方式将该脚本包含在我的 pytest 测试套件中 我尝试了两种有效但不太好的方法 一种方法是将
  • 如何将 numpy rearray 的子集转换为连续数组?

    我有一个recarray来自读取 csv 文件 我有兴趣将列的子集转换为连续浮点数组 我想避免将它们转换为列表或将它们一一堆叠 我尝试了中的建议https stackoverflow com a 11792956 https stackov
  • 如果另一列中的值为空,则删除重复项 - Pandas

    我拥有的 df Name Vehicle Dave Car Mark Bike Steve Car Dave Steve 我想从 名称 列中删除重复项 但前提是 车辆 列中的相应值为空 我知道我可以使用 df dropduplicates
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 如何仅注释堆积条形图的一个类别

    我有一个数据框示例 如下所示 data Date 2021 07 18 2021 07 19 2021 07 20 2021 07 21 2021 07 22 2021 07 23 Invalid NaN 1 1 NaN NaN NaN N
  • Jupyter笔记本突然变得很慢

    我以前在anaconda环境下运行jupyter运行得很好 显示警告后 IOPub data rate exceeded The notebook server will temporarily stop sending output to
  • django 中的身份验证方法返回 None

    你好 我在 django 中做了一个简单的注册和登录页面 当想要登录时 登录视图中的身份验证方法不返回任何内容 我的身份验证应用程序 模型 py from django db import models from django contri
  • 预测测试图像时出现错误 - 无法重塑大小数组

    我正在尝试使用 TensorFlow 和 Keras 在 Python 中进行图像识别 并且我已经关注了下面的博客 https stackabuse com image recognition in python with tensorfl
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 我可以在 if 语句中使用“as”机制吗

    是否可以使用as in if类似的声明with我们使用的 例如 with open tmp foo r as ofile do something with ofile 这是我的代码 def my list rtrn lst True if
  • RuntimeError(f"目录 '{directory}' 不存在") RuntimeError: 目录 'app/static' 不存在

    当我运行 server py 文件时出现错误 File C Users nawin AppData Local Programs Python Python38 lib site packages starlette staticfiles
  • 在 for 循环中访问 itertools 产品的元素

    我有一个列表列表 是附加 itertools 产品的一些其他结果的结果 我想要的是能够使用 for 循环访问列表列表中列表的每个元素 但我无法访问所有元素 我只能访问最后一个列表的元素 结果是一个非常巨大的列表列表 例如 1 2 4 3 6
  • 如何让“grep -zoP”单独显示每个匹配项?

    我有一个此表格的文件 X this is the first match blabla X this is the second match and here we have some fluff 我想提取 X 之后和相同标记之间出现的所有
  • Python matplotlib:将轴标签/图例从粗体更改为常规粗细

    我正在尝试制作一些出版质量的图 但遇到了一个小问题 默认情况下 matplotlib 轴标签和图例条目的权重似乎比轴刻度线重 是否有办法强制轴标签 图例条目与刻度线的重量相同 import matplotlib pyplot as plt
  • python:函数中的变量,点前面是函数名

    我需要理解这个概念 其中我们可以在函数定义中的变量名中使用点 这里没有类定义 也没有模块 Python 不应该接受包含点的变量名 def f x f author sunder f language Python print x f aut
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1
  • 正则表达式 - 匹配不包含字符串的模式

    我对正则表达式很陌生 并且一直在寻找方法来做到这一点 但没有成功 给定一个字符串 我想删除以 abc 开头 以 abc 结尾且中间不包含 abc 的任何模式 如果我做 abc abc abc 它将匹配以 b 开头 以 abc 结尾并且中间包
  • 防止 Ada DLL 中的名称损坏

    有没有一种简单的方法可以防止在创建 Ada DLL 时 Ada 名称被破坏 这是我的 adb 代码 with Ada Text IO package body testDLL is procedure Print Call is begin

随机推荐

  • 警告使用函数指针的结构内部的匿名命名空间

    在我的程序中 Put this code in a separate header file struct S1 typedef struct int unused RETVAL typedef RETVAL MyFunc void res
  • 检查文件是否存在而不创建它

    如果我这样做 File f new File c text txt if f exists System out println File exists else System out println File not found 然后文件
  • python:更改符号变量并分配数值

    为了计算导数和其他表达式 我使用了 sympy 包并表示T sy Symbol T 现在我已经计算出正确的表达式 E T 2 F deriv T T rho where def F deriv rho T rho ret 0 for n i
  • 如何将VueJS中的属性对象传递给组件来修改它?

    将 VueJS 中的属性对象传递给组件并在那里修改它的最佳实践是什么 例如 人员表 姓名 名字 年龄 性别等 单击某个条目后 会弹出一个对话框 您可以在其中修改该条目 如果我通过 props 将条目传递给组件并修改它 我会收到 错误消息 避
  • D3.js:饼图,仅向外部区域添加边框

    我在 D3 中得到了一个饼图 并用笔画分隔了每个切片 但是 我想仅向切片的外部区域添加边框 而不是在连续线上添加边框 而是尊重原始切片中的笔划创建的间隙 请参阅我的图片以进行澄清 关于如何做到这一点有什么想法吗 See http jsfid
  • npm更新成功,但仍然显示旧版本

    当我做一个npm v我发现我仍然使用 5 6 0 并不断收到执行操作的提示npm i npm 但我已经做了一个sudo npm install npm latest g并用 a 进行双重检查npm outdated g depth 0看到我
  • MySQL命名约定,字段名应该包含表名吗?

    有朋友告诉我 我应该在同一个表的字段名中包含表名 我想知道为什么 而且应该是这样吗 例子 Table Users Fields user id username password last login time 我发现前缀 user 毫无意
  • “范围的坐标或尺寸无效”

    我正在开发一个与 REST API 链接并将数据放入 Google 表格的 Google Apps 脚本 我已经成功完成一次此操作 但是在访问一些不同的数据时 我收到错误消息 范围的坐标或尺寸无效 当它们在我的其他脚本上完美运行时 访问的所
  • 假设不变的 ASCII 编码,用 Rubyist 方法解码该编码字符串

    我的程序是二进制协议的解码器 该二进制协议中的字段之一是编码的String 中的每个角色String是可打印的 并且代表一个整数值 根据我正在解码的协议的规范 它表示的整数值取自下表 其中列出了所有可能的字符 Character Value
  • 依赖项的 Maven 项目变量

    我有一个加载小程序的 html 文件 html需要通过名称引用jar 并且由于maven根据artifactid 版本等对其进行命名 因此html需要随着项目的发展动态更新 似乎资源过滤是可行的方法 但我无法弄清楚要插入的变量应该是什么样子
  • jQuery 动画小数递增/递减

    我想一步一步地动画两个十进制数之间的差异 已经发现乔斯 克劳克罗夫特的解决方案 http www josscrowcroft com 2011 code jquery animate increment decrement numeric
  • 数据类中的属性

    描述 我正在尝试实现一个仅包含几个参数的简单数据类 dataclass class ReconstructionParameters img size int CR int denoise bool epochs int learning
  • 如何以可跨 Linux、Windows 和 MacOS 移植的方式收集 Python 3 中的当前架构?

    我正在尝试找到一种可移植的方式来收集当前的架构 例如x86 64 or AArch64 我将用它来填充一个标志 例如is x86 使用Python 3 它看起来像import platform platform machine 函数是正确的
  • 获取 CPU、RAM 和 GPU 信息 - UWP 应用

    是否可以在 UWP 应用程序中获取计算机的 CPU GPU 和 RAM 信息 E 在文本块中显示此信息 我想知道处理器型号 例如 Intel Core i7 xxxx 和总 RAM 我想知道处理器型号 例如 Intel Core i7 xx
  • 启发式参与者永无休止的定期恢复

    几天来我们的日志里一直充斥着这样的消息 2018 06 15 12 19 23 WARN com arjuna ats arjuna Periodic Recovery Transaction 0 ffff0a983f1e 1f3aa2ff
  • IE10 上的 WebSocket 出现 SecurityError

    我目前正在 IE10 在 Windows 8 上 下开发一个网站 使用 JavaScript 中的 WebSockets 它在 Firefox 18 和 Chrome 25 下运行良好 但在 IE10 上建立连接时出现 SecurityEr
  • 如何解决android中的OutOfMemoryError?

    我已经准备了可绘制动画的数量 当应用程序启动时 第一个动画将启动 我有两个按钮 下一个和上一个 具有相同的活动 当我单击下一个按钮时 我遇到了异常 例如 java lang OutOfMemoryError bitmap size exce
  • java中基于表单的身份验证的混乱

    谁能告诉我 我该如何处理j 安全检查java中基于表单的身份验证中的servlet 我是否必须映射 servlet 类j 安全检查web xml 文件中的名称 例如
  • 我如何在 Swift 中投射 @Binding

    很快我就可以用 Int doubleVariable 将 Int 转换为 Double 但是如何将 Binding 转换为 Binding 呢 然后我可以将 Binding var intVar Int 传递给需要 Double 绑定的函数
  • Python 正则表达式模块即使重叠 = True 也找不到所有匹配项

    我正在使用 PyPy正则表达式模块 https pypi org project regex 具有重叠匹配支持 我有以下代码 其中有一个字符串 A 我正在使用正则表达式查找在正则表达式中定义的 DNA 模式 我想找到与我的 RE 的所有匹配