我有一个随机生成的字符串:
polymer_str = "diol diNCO diamine diNCO diamine diNCO diamine diNCO diol diNCO diamine"
我想找到最长的“diNCO二醇”序列和最长的“diNCO二胺”序列。因此,在上述情况下,最长的“diNCO二醇”序列为1,最长的“diNCO二胺”序列为3.
我将如何使用python的re模块进行此操作?
提前致谢。
编辑:
我的意思是给定字符串的最长重复次数。所以带有“diNCO二胺”的最长的串是3:
二醇二氮二胺二硝基二胺二硝二胺二硝基二醇二氮二胺
答案 0 :(得分:5)
可以找到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)
findall
和finditer
之间的最大区别在于第一个返回列表对象,而第二个迭代匹配对象。此外,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")