繁体   English   中英

Python:重新查找最长序列

[英]Python: re.find longest sequence

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

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:
二醇二NCO二胺二NCO二胺二NCO二胺NCO二醇二NCO二胺

扩展Ealdwulf回答

可以在此处找到有关re.findall文档。

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内存效率会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方法会稍微慢一些。

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

然后找到最长的。

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)))

一种是使用findall

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

使用重新:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM