Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:re.find最长序列_Python_Regex - Fatal编程技术网

Python:re.find最长序列

Python:re.find最长序列,python,regex,Python,Regex,我有一个随机生成的字符串: polymer_str = "diol diNCO diamine diNCO diamine diNCO diamine diNCO diol diNCO diamine" 我想找出“diNCO二醇”的最长序列和“diNCO二胺”的最长序列。因此,在上述情况下,最长的“diNCO二醇”序列为1,最长的“diNCO二胺”序列为3 我将如何使用python的re模块来实现这一点 提前谢谢 编辑: 我是指给定字符串的最长重复次数。因此,含有“diNCO二胺”的最长字符串

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

polymer_str = "diol diNCO diamine diNCO diamine diNCO diamine diNCO diol diNCO diamine"
我想找出“diNCO二醇”的最长序列和“diNCO二胺”的最长序列。因此,在上述情况下,最长的“diNCO二醇”序列为1,最长的“diNCO二胺”序列为3

我将如何使用python的re模块来实现这一点

提前谢谢

编辑:
我是指给定字符串的最长重复次数。因此,含有“diNCO二胺”的最长字符串为3:

二元醇二胺二元醇二胺二元醇二胺二元醇二胺二元醇二胺

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

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

我认为op需要最长的连续序列。您可以获得所有连续序列,如: seqs=re.findall((?:二氨基二胺)+”,聚合物)

然后找到最长的。

在的上展开:

可以找到有关
re.findall
的文档

这可以写成一行,但这种形式的可读性变差了

备选方案:

如果
polymer\u 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)

findall
finditer
之间最大的区别在于前者返回一个列表对象,而后者迭代匹配对象。另外,
finditer
方法会稍微慢一些。

您所说的最长序列是什么意思?在我看来,你正在做精确匹配!这听起来像是生物信息学:也许“串联重复”这个词就是你要找的:n00ki3,我要找的是最大的区块。“diNCO二胺”是一个重复块,我想知道最大的块是什么。它可以找到总数,而不是最长的序列。对不起,我误解了这个问题。这不能正确解释空格。第二行还有一个额外的“b”+谢谢你比我更亲密!您将如何解决空间问题?关于“b”你是对的。这就是复制和粘贴的问题:)这不起作用。它查找第一个匹配项,而不是最长的匹配项。polymer_str=“二醇-二元二胺-塔可-二元二胺-二元二胺-二元二胺-二元二胺-二元二醇-二元二胺”正确结果为3;这将返回1。实际上,每次找到新的匹配项时,组(0)都会被覆盖。目前无法使用“re”模块从正则表达式中的“+”或“*”中获取多个组。我在回答中对此进行了扩展。tgray基本上做到了这一点。我只想补充一点,“?:”符文是必需的,否则findall会将括号内的每个匹配项作为列表中的一个单独条目返回,在本例中,这会使对象失效。这实际上会返回最终匹配中的字符数,而不是匹配数(如问题中所建议的)而不是包含最长匹配的字符串。很好,我已经修复了返回匹配数的代码。如果需要实际字符串,只需返回“最长匹配”。
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)))
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)))