【问题标题】:Python: re.find longest sequencePython:重新查找最长的序列
【发布时间】:2023-03-30 04:36:01
【问题描述】:

我有一个随机生成的字符串:

polymer_str = "diol diNCO diamine diNCO diamine diNCO diamine diNCO diol diNCO diamine"

我想找出最长的“diNCO diol”序列和最长的“diNCO diamine”序列。所以在上面的例子中,最长的“diNCO diol”序列是1,最长的“diNCO diamine”是3。

我将如何使用 python 的 re 模块执行此操作?

提前致谢。

编辑:
我的意思是给定字符串的最长重复次数。所以“diNCO diamine”的最长字符串是 3:
二醇diNCO二胺diNCO二胺diNCO二胺diNCO二醇diNCO二胺

【问题讨论】:

  • 最长序列是什么意思?在我看来,您正在做完全匹配!
  • 这听起来像生物信息学:也许“串联重复”这个词是您正在寻找的:books.google.de/…
  • n00ki3,我正在寻找最大的块。 “diNCO 二胺”是一个重复块,我想知道最大的块是什么。

标签: python regex


【解决方案1】:

Ealdwulfanswer 上展开:

re.findall 上的文档可以在here 找到。

def getLongestSequenceSize(search_str, polymer_str):
    matches = re.findall(r'(?:\b%s\b\s?)+' % search_str, polymer_str)
    longest_match = max(matches)
    return longest_match.count(search_str)

这可以写成一行,但以这种形式变得不那么可读了。

替代方案:

如果polymer_str 很大,则使用re.finditer 会更有效地使用内存。以下是您可以采取的方法:

def getLongestSequenceSize(search_str, polymer_str):
    longest_match = ''
    for match in re.finditer(r'(?:\b%s\b\s?)+' % search_str, polymer_str):
        if len(match.group(0)) > len(longest_match):
            longest_match = match.group(0)
    return longest_match.count(search_str)

findallfinditer 之间最大的区别是第一个返回一个列表对象,而第二个迭代 Match 对象。此外,finditer 方法会慢一些。

【讨论】:

  • 这实际上返回了最终匹配中的字符数,而不是匹配数(正如问题中所建议的那样),而不是包含最长匹配的字符串。
  • 好点,我已经修复了返回匹配数的代码。如果他们想要实际的字符串,他们只需要返回 'longest_match'。
【解决方案2】:

我认为操作需要最长的连续序列。您可以获得所有连续的序列,例如: seqs = re.findall("(?:diNCO 二胺)+", polymer_str)

然后找到最长的。

【讨论】:

  • 我在回答中对此进行了扩展。
  • tgray 已经完成了大部分工作。我只想补充一点 '?:' 符文是必需的,否则 findall 会将括号内的每个匹配项作为列表中的单独条目返回,在这种情况下会破坏对象。
【解决方案3】:
import re
pat = re.compile("[^|]+")
p = "diol diNCO diamine diNCO diamine diNCO diamine diNCO diol diNCO diamine".replace("diNCO diamine","|").replace(" ","")
print max(map(len,pat.split(p)))

【讨论】:

    【解决方案4】:

    一种是使用findall:

    polymer_str = "diol diNCO diamine diNCO diamine diNCO diamine diNCO diol diNCO diamine"
    len(re.findall("diNCO diamine", polymer_str)) # returns 4.
    

    【讨论】:

    • 求的是总数,而不是最长的序列
    • 对不起,我误解了这个问题。
    【解决方案5】:

    使用回复:

     m = re.search(r"(\bdiNCO diamine\b\s?)+", polymer_str)
     len(m.group(0)) / len("bdiNCO diamine")
    

    【讨论】:

    • 这没有正确考虑空格。第二行还有一个额外的“b”。 +1 比我更亲近!
    • 如何解决空格问题?你是对的'b'。这就是复制粘贴的问题:)
    • 这不起作用。它找到第一个匹配项,而不是最长的匹配项。 polymer_str = "diol diNCO diamine tacos diNCO diamine diNCO diamine diNCO diamine diNCO diol diNCO diamine" 正确的结果是3;这将返回 1。
    • 实际上 group(0) 每次找到新匹配时都会被覆盖。目前无法使用“re”模块从正则表达式中的“+”或“*”获取多个组。
    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2013-04-09
    • 2023-03-25
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多