Python:重新找到最长的序列

时间:2009-07-20 19:15:36

标签: python regex

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

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

我想找到最长的“diNCO二醇”序列和最长的“diNCO二胺”序列。因此,在上述情况下,最长的“diNCO二醇”序列为1,最长的“diNCO二胺”序列为3.

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

提前致谢。

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

5 个答案:

答案 0 :(得分:5)

扩展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之间的最大区别在于第一个返回列表对象,而第二个迭代匹配对象。此外,finditer方法会稍慢。

答案 1 :(得分:3)

我认为操作系统需要最长的连续序列。你可以得到所有连续的序列,如: seqs = re.findall(“(?:diNCO diamine)+”,polymer_str)

然后找到最长的。

答案 2 :(得分: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)))

答案 3 :(得分:0)

一个是使用findall

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

答案 4 :(得分:0)

使用re:

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