2017-11-05 7 views
-1

単語の長さが十分で、文字列の末尾に記号()[email protected]#$%^&*.,'が含まれているかどうかをチェックしたいと思います。条件は次のとおりです。文字列内のシンボルのチェックについています

  • 単語は3文字以上でなければなりません。シンボル「 - 」正しい言葉は開始時に特殊記号を含めることはできません
  • charとしてカウントし、ミドル 文字列の

私は正規表現を使用することにしました:

def check_word(word: str) -> bool: 
     m = re.match("[^()[email protected]#$%^&*.,]{4,}[()[email protected]#‌​$‌​%^&*.,]*", word) 
     if m is not None: 
     return True 
     return False 
    print(check_word("Hell,oo")) # False 
    print(check_word("Hello,!")) # True 
    print(check_word('Hello"')) # False 

なぜ私の質問がありますre.matchの場合は、文字の前に記号があってはならないと指摘しました。Trueprint(check_word("Hell,oo")に置いておきます。そして、なぜprint(check_word('Hello"'))がの場合は、'"'という記号がリストにも含まれていないとしますか?

+0

'^ [!?。^()\ dは_ @の#$%^&*を、 '] {3、} [])\ d!?@#$%^&*。、 '] * $ ' – sln

答えて

2

文字列の先頭と末尾を示すには、^$を追加する必要があります。 ^は、コメントに示されているようにmatch()と暗示されているので、$と指定する必要があります。次に例を示します。

re.match(r'[^()[email protected]#‌​$‌​%^&*.,]{4,}[()[email protected]#‌​$‌​%^&*.,]*$', 'Hell,oo') 

しかし、あなたはが文字列の記号が含まれているを必要とするので、あなたは+マッチ1文字以上ながら、+を使用する代わりに**以来の試合の文字以上をゼロにする必要があります。または{4,}のように*を指定の番号に置き換えます。

そして、あなたの質問には:

そして、なぜシンボル'"'ない場合print(check_word('Hello"'))もリストにTrueのですか?

[^()[email protected]#‌​$‌​%^&*.,]のためです。これは、このセットのではないのいずれかの文字に一致し、"は含まれません。それを解決するために、あなたが任意のアルファベット、英語の文字と一致する代わりに[a-zA-Z]使用することができます。

re.match(r'[a-zA-Z]{4,}[()[email protected]#‌​$‌​%^&*.,]*$', 'Hell,oo') 
+2

それは' match 'と暗示されているので、'^'ではありません。 –

+1

また、 '\ w'には数字とアンダースコアが含まれます。 –

+0

ありがとうございます。それに応じて編集。 – ammarx

関連する問題