2009-07-20 53 views
0

我有一个随机生成的字符串:的Python:re..find最长序列

polymer_str = "diol diNCO diamine diNCO diamine diNCO diamine diNCO diol diNCO diamine" 

我想找到“diNCO二醇”的最长序列和最长“diNCO二胺”的。所以在上面的情况中,最长的“diNCO二醇”序列是1,最长的“diNCO二胺”是3.

我将如何去做这个使用python的re模块?

在此先感谢。

编辑:
我的意思是一个给定的字符串重复的最长的数量。因此,与 “diNCO二胺” 中最长的字符串是3:
二醇diNCO二胺diNCO二胺diNCO二胺 diNCO二醇diNCO二胺

+0

你是什么意思的最长序列?在我看来你正在做精确匹配! – 2009-07-20 19:21:13

+0

这听起来像生物信息学: 也许单词“串联重复”是你在找什么: http://books.google.de/books?id=bIe-FPGhed0C&pg=PA119&lpg=PA119&dq=python+tandem+repeats&source= bl&ots = 6aR-PERsZg&sig = XbnRQZpNldf1t31 -iIcyl-wOgiA&hl = de&ei = bNZkSqzfL4XWmgOW4sCCBQ&sa = X&oi = book_result&ct = result&resnum = 1 – n00ki3 2009-07-20 20:42:22

+0

n00ki3,我正在寻找最大的区块。 “diNCO二胺”是一个重复的块,我想知道最大的块是什么。 – Nope 2009-07-21 03:06:20

回答

5

扩展在Ealdwulfanswer:上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) 

findallfinditer之间最大的区别是,第一个返回一个列表对象,而在Match对象的第二迭代。此外,finditer方法会稍微慢一些。

0

一个是是使用findall

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

找到总数,而不是最长的序列 – 2009-07-20 19:29:00

+0

对不起,我误解了这个问题。 – 2009-07-20 19:37:27

0

重新使用:

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

我认为op需要最长的连续序列。你可以得到所有连续的序列,如: 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)))