2017-10-15 9 views
-1

長さ3の部分文字列の式がちょうど1つのc文字を含むかどうかを確認しようとしています。つまり、文字列内の長さ3のすべての部分文字列には、c文字を含める必要があります。たとえば、正規表現を使用して文字列のサブシーケンスを確認する

などの文字列:"a", "cc", "bbc", "cabcbbca", "acaacbacbb", "abcabcabc"などのすべての文字列は、長さ3の部分文字列に1つだけ含まれます。部分文字列の長さが2未満の場合は、関係なく有効です。

ただし、"caaa", "bbcaacbcaac"などの文字列は、長さ3の部分文字列が含まれており、正確に1つの文字が含まれていないため、この要件を満たしていません。c文字。元のリストから有効な式を['a', 'cc', 'bbc', 'cabcbbca', 'acaacbacbb', 'abcabcabc']返し

# Testing expressions 
expressions = ["a", "cc", "bbc", "cabcbbca", "acaacbacbb", "abcabcabc", 
       "caaa", "bbcaacbcaac"] 

# Getting substrings of a certain length 
def get_substrings(string, sublen): 
    substrs = [] 

    for i in range(len(string)): 
     if len(string[i:i+sublen]) == sublen: 
      substrs.append(string[i:i+sublen]) 

    return substrs 

# extracting valid expressions 
def get_valid_expression(expressions, minlen, char_to_check): 

    valid = [] 

    for string in expressions: 

     # if string is less than min length, then it is already valid 
     if len(string) < minlen: 
      valid.append(string) 

     else: 

      # get the subtrings 
      lst = get_substrings(string, minlen) 

      # Check if the substring contains exactly one of the characters 
      if all(substring.count(char_to_check) == 1 for substring in lst): 
       valid.append(string) 

    return valid 

print("Valid expressions with all substrings of length 3 containing exactly one c:") 
print(get_valid_expression(expressions, 3, "c")) 

は、これまでのところ、私はこれをチェックする迅速なPythonプログラムを作りました。

私はこれを行うことができます正規表現で彼らの方法ですか?私はこれを検索する正規表現を生成すると良いと多くのコードを必要としないと思う。

+0

あなたの条件言い替えるするには、次の文字列にすべてのCさんが持っている必要があります次の前のcと最初と最後のcの間の正確に2文字の距離は、文字列の開始と終了のそれぞれに0〜2文字の距離を持たなければなりません。 –

+0

@MichaelButscherはい、それはおそらくそれを置くためのより良い方法です。 – RoadRunner

答えて

1

これは動作するはずです:

^.{0,2}$|^[^c]{0,2}(c[^c]{2})*c[^c]{0,2}$ 

Try it

を、Bをテストするには、のみ、使用するC:

^[abc]{0,2}$|^[ab]{0,2}(c[ab]{2})*c[ab]{0,2}$ 
関連する問題