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.
谢谢大家的帮忙。
您可以使用正则表达式来匹配这样的模式。
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)或更好的东西来计算字符出现次数。
谢谢!!这可能有效,但是,我还有一个问题:如果我想向后添加模式?假设,abbcbbbccccd,一旦我们达到这种模式,我们就完成了。 –
@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,搜索完成。有没有人有一个正确的想法来表达模式是“重新”?谢谢!
这不是一个简单的问题,请显示你的努力 –
这似乎与正则表达式匹配的方式类似 –
可能知道如何解释“4,5,5,5,5,8”,但不知道“4,5 ,...,5,8“。 –