Python: найти самую длинную последовательность - PullRequest
1 голос
/ 20 июля 2009

У меня есть строка, которая генерируется случайным образом:

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

Я бы хотел найти самую длинную последовательность "diNCO диол" и самую длинную из "diNCO диамин". Таким образом, в приведенном выше случае самая длинная последовательность diNCO-диола равна 1, а самая длинная последовательность diNCO-диамина равна 3.

Как бы я поступил так, используя модуль re python?

Заранее спасибо.

РЕДАКТИРОВАТЬ:
Я имею в виду самое длинное количество повторений данной строки. Таким образом, самая длинная строка с диамином diNCO составляет 3:
диол диНКО-диамин диНКО-диамин диНКО-диамин диНКО-диол диНКО-диамин

Ответы [ 5 ]

5 голосов
/ 21 июля 2009

Расширение Ealdwulf * ответ :

Документацию по 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 состоит в том, что первый возвращает объект списка, а второй перебирает объекты Match. Кроме того, finditer подход будет несколько медленнее.

3 голосов
/ 21 июля 2009
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 голосов
/ 20 июля 2009

Я думаю, что оператору нужна самая длинная непрерывная последовательность. Вы можете получить все смежные последовательности, такие как: seqs = re.findall ("(?: diNCO диамин) +", Polymer_str)

, а затем найдите самое длинное.

0 голосов
/ 20 июля 2009

Использование re:

 m = re.search(r"(\bdiNCO diamine\b\s?)+", polymer_str)
 len(m.group(0)) / len("bdiNCO diamine")
0 голосов
/ 20 июля 2009

Один должен был использовать findall:

polymer_str = "diol diNCO diamine diNCO diamine diNCO diamine diNCO diol diNCO diamine"
len(re.findall("diNCO diamine", polymer_str)) # returns 4.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...