在python字符串中查找具有每个模式组件的灵活长度的模式

时间:2017-10-31 07:46:41

标签: python string text mining

我有一个字符串:

str_x = "121001221122010120211122211122222222112222"

我想知道在字符串中观察到给定模式的次数,但该模式应该被视为灵活

我正在寻找的模式是:

  • 至少三个2&#s;然后至少两个1'其次是至少三个2&#39 ; S

满足这种条件的模式因此例如是" 22211222",而且" 2222111222"和" 222222221111111111222"

我想了解这个"灵活模式"多少次?在str_x中可以看到。

这里的正确答案是2次。

任何想法如何做到这一点?非常感谢。

修改

鉴于我上面的定义,2次的答案实际上是不正确的,因为有效的模式重叠... " 222111222"," 2221112222"," 22211122222"等等都是满足目标的模式。

我想要的是找到不重叠的图案数量(即仍然是2次)

2 个答案:

答案 0 :(得分:1)

您必须使用正则表达式来解决您的问题: https://docs.python.org/2/library/re.html

正则表达式:
regex = r"2{3,}?1{2,}?2{3,}?"
意味着=找到至少三个2,然后至少两个1,然后至少三个2&#39>

符号2{3,}表示找到至少三个2' ?表示 - 贪婪搜索 - 可能重叠的搜索 如果要查找不重叠的模式,只需删除?

即可
import re

regex = r"2{3,}?1{2,}?2{3,}?"

test_str = "121001221122010120211122211122222222112222"

matches = re.finditer(regex, test_str)

for matchNum, match in enumerate(matches):
    matchNum = matchNum + 1

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))
print ("total matches: {matches}".format(matches= matchNum))

答案 1 :(得分:1)

这是一段有效的代码:

    def count_pattern(str):
        # one_count keeps count of contiguous 1s
        # we check for the pattern at 2 just after a block of 1s
        # count keeps track of pattern counts
        count=0
        one_count=0
        for i in range(1,len(str)):
            if str[i]=='1':
                if str[i-1]=='1':
                    one_count=one_count+1
                else:
                    one_count=1
            elif (str[i]=='2')&(str[i-1]=='1')&(len(str)-i>2)&
                 (i>one_count+2)&(one_count>1)&(str[(i+1):(i+3)]=='22')&
                 (str[(i-one_count-3):(i-one_count)]=='222'):
                count=count+1
         return(count)


      print("Number of times the pattern 
       occurs=",count_pattern('121001221122010120211122211122222222112222'))