2017-10-16 15 views
0

私の問題は論理的には簡単ですが、実装するのは難しいです。私は数字のリストを持っています(あるいは数字の列を言うこともできますが、文字列とリストの間でやりとりするのは難しくありません)。重複した特定のパターンの出現を数えたいと思います。例えば、コードは以下である:Python:リストや文字列に重複がある特定のパターンの出現を数えるには?

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

"-1,4,5,8-" が発生し、IカウントA1 = 1、A2 = 1、A3 = 1については "4,4,5,8" について「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,8"のアカウントを知っているかもしれませんが、 "4,5 、...、5,8 "。 –

答えて

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)などで文字の出現を数えることができます。

+0

ありがとう!!これはうまくいくかもしれませんが、私はもう一つ質問があります。このパターンでdに達すると完了する。 –

+0

@ RichardRiverlandsあなたは簡単にあなたの例を解決するために同じロジックを使うことができます。つまり、 'bc'部分の繰り返しを追加するだけです。照合するパターンはa +(b + c +)+ d +となります。 – SAMBECK

0

Iは、この意志出力が重複しないように "268"、 "26668"、 "266666668" のようなストリング

(test_string r'26 + 8' )

re.findallを使用しようとしました。しかし、 "2(6 + 8 +)+ 7"(この構文は "re"では機能しません)、私が本質的に望むパターンは "266868688887"あなたが7に達すると、検索が完了します。パターンを表現するための正しいアイデアが「再」か?ありがとう!

関連する問題