在列表中查找连续模式

时间:2019-06-07 00:54:21

标签: python python-3.x pattern-matching

如何使用python查找模式的连续出现?例如,在['a','b','a','b','c']中,我们有2个连续的'ab',因此它发生了两次。 ['a', 'b', 'a']不包含连续模式。

我写了一个函数,它只能计算模式的发生,而不一定是连续的发生

def get_occur(list, seq):
    return ''.join(list).count(''.join(seq))

1 个答案:

答案 0 :(得分:0)

我想指出的是,如果您实际上是想在字符串中查找重复模式,则应该使用re builtin

以@Selcuk在他的评论中所说的为基础,

l = ['a', 'b', 'a', 'b', 'c', 'd']
print(l)

def consec_pattern(lst, pvs):
    # recursively return number of consecutive times pvs (previous pattern)
    # occurs in lst (list)

    if len(lst) < len(pvs):
        return 0 # no occurances of pvs in lst

    if lst[:len(pvs)] == pvs:  # if pvs is found at the start of lst
        shorter = lst[len(pvs):]
        return consec_pattern(shorter, pvs) + 1
    return 0  # if this is not the case, return 0

print(consec_pattern(l, [*'ab']))

# we can now annotate the list with number of occurances
l = [*'xababcd']
print(*l)
for i in range(len(l)):
    # take an element off of l each time you call to find
    # the value for the next position
    print(consec_pattern(l[i:], [*'ab']), end=' ')
print()

如果您想要特定子列表的连续出现,这是一个O(n)解决方案,并且可以用于查找所有子列表的出现,但是如果您需要所有连续的子列表,可能有一种更有效的方法发生。

修改

使用正则表达式库,您可以使用搜索功能

import re
string = 'xababcdab'
pattern = 'ab'

match = re.search(f'({pattern})+', string)
start, end = match.span()
consecutive_matches = (end-start)//len(pattern)
print(consecutive_matches)  # outputs 2