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