Python:如何计算在列表或字符串中重叠的特定模式的发生?

问题描述:

我的问题在逻辑上很容易,但很难为我实现。我有一个数字列表(或者你可以说是一串数字,在字符串和列表之间转换并不困难)我想计算一些具有重叠的特定模式的发生。例如,该代码是下面:Python:如何计算在列表或字符串中重叠的特定模式的发生?

A = [0, 1, 2 ,4, 5, 8, 4, 4, 5, 8, 2, 4, 4, 5, 5, 8, 9, 10, 3, 2] 

为 “4,5,8” 的发生,然后我数A1 = 1,A2 = 1,A3 = 1。对于 “4,4,5,8-”发生,则我计算a1 = 2,a2 = 1,a3 = 1。对于“4,4,5,5,5,8,8,8”,我计算a1 = 2,a2 = 3,a3 = 3 。也就是说,对于一个模式,如果该模式至少包含“4,5,8”这个顺序,那么您就会计数。 “4,5,9”不算。 “4,4,4,5,5,2,8”根本不算。对于“4,5,4,5,8”,a1 = 1,a2 = 1,a3 = 1.

谢谢大家的帮忙。

+0

这不是一个简单的问题,请显示你的努力 –

+2

这似乎与正则表达式匹配的方式类似 –

+0

可能知道如何解释“4,5,5,5,5,8”,但不知道“4,5 ,...,5,8“。 –

您可以使用正则表达式来匹配这样的模式。

https://regexr.com/是一个超级有用的工具,用于试验/学习正则表达式。

内置的模块重新这项工作:

import re 

def make_regex_object(list_of_chars): 
    # make a re object out of [a, b... n]: 'a+b+ ... n+'' (note the '+' at end) 
    # the '+' means it matches one or more occurrence of each character 
    return re.compile('+'.join([str(char) for char in list_of_chars]) + '+') 

searcher = make_regex_object(['a', 'b', 'c', 'd']) 
searcher.pattern # 'a+b+c+d+' 

x = searcher.search('abczzzzabbbcddefaaabbbccceeabc') 
# caution - search only matches first instance of pattern 

print(x) # <_sre.SRE_Match object; span=(7, 14), match='abbbcdd'> 
x.end() # 14 
x.group() # 'abbbcdd' 

如果要算模式的多个实例,你可以再重复此对您的字符串的其余部分。你可以用x.group()。count(char)或更好的东西来计算字符出现次数。

+0

谢谢!!这可能有效,但是,我还有一个问题:如果我想向后添加模式?假设,abbcbbbccccd,一旦我们达到这种模式,我们就完成了。 –

+0

@RichardRiverlands您可以使用相同的逻辑轻松解决您的示例 - 即您只需添加'bc'部分的重复。所以匹配的模式是a +(b + c +)+ d +。 – SAMBECK

我试图使用

re.findall(r'26 + 8' ,test_string)

这将输出在非重叠的方式的子像 “266666668”, “268”, “26668” 。但是,如果我想搜索是否存在如下所示的模式:“2(6 + 8 +)+ 7”(该语法在“re”中不起作用,那么我基本上想要的是诸如“266868688887” ,其中你可以看到有6到8之间的来回运动。一旦你达到7,搜索完成。有没有人有一个正确的想法来表达模式是“重新”?谢谢!