0

文字列は文字と数字で構成されますが、「c」が含まれている場合、「c」の後に続く文字は「h」または「k」のいずれかでなければなりません。Python用にそのような正規表現を作成する方法を知っている人はいますか?

4

3 に答える 3

1

私は次のことを提案します:

^(?!.*c(?![hk]))[^\W_]+$

説明:

^       # Start of string
(?!     # Assert that it's not possible to match...
 .*     #  Any string, followed by
 c      #  the letter c
 (?!    #  unless that is followed by
  [hk]  #   h or k
 )      #  (End of inner negative lookahead)
)       # (End of outer negative lookahead).
[^\W_]+ # Match one or more letters or digits.
$       # End of string

[^\W_]\w「。を除いて、に一致するすべての文字に一致する」を意味し_ます。

>>> import re
>>> strings = ["test", "check", "tick", "pic", "cow"]
>>> for item in strings:
...     print("{0} is {1}".format(item,
...           "valid" if re.match(r"^(?!.*c(?![hk]))[^\W_]+$", item)
...           else "invalid"))
...
test is valid
check is valid
tick is valid
pic is invalid
cow is invalid
于 2013-01-13T17:10:06.690 に答える
0

^([^\Wc]*(c[hk])*)*$も機能します。文字列全体(from^から$)はブロックの繰り返しで構成されている必要があり、各ブロックには任意の数の非c文字、、[^\Wc]*および任意の数のchまたはckペアが含まれている必要があり(c[hk])*ます。

例: 'checkchek'
re.search(r'^([^\Wc]*(c[hk])*)*$', 'checkchek').group()
を与える

空の文字列と一致させたくない場合は、最後の文字列を。に置き換え*ます+。通常、入力文字列が一致しない場合にコメントで言及されるようなエラーを回避するには、検索結果を変数に割り当てて、次のいずれでもないかどうかをテストします。

In [88]: y = re.search(r'^([^\Wc]*(c[hk])*)*$', 'ca')

In [89]: if y:
   ....:     print y.group()
   ....: else:
   ....:     print 'No match'
   ....:     
No match
于 2013-01-13T17:38:52.910 に答える
-1

次のコードは、myinputstring内の「cの後にhまたはkが続かない」の存在を検出し、その場合は「問題」を出力します。

import re
if ((re.findall(r'c(?!(h|k))', myinputstring).length)>0):
    print "problem"
于 2013-01-13T17:08:47.760 に答える