Python:re.查找最长序列
我有一个随机生成的字符串:
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:
diol diNCO diamine diNCO diamine diNCO diamine diNCO diol diNCO diamine
5 个回答
3
我觉得提问者想要的是最长的连续序列。你可以先找出所有的连续序列,比如:
seqs = re.findall("(?:diNCO diamine)+", polymer_str)
然后再从中找出最长的那一个。
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)))
10
关于 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
会更节省内存。下面是你可以这样做的方式:
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
的方法会稍微慢一些。