2017-02-26 9 views
0

私はPythonで正規表現を学習していますが、.group()に基づいて何かを見つけることができませんでした。ここで正規表現でのグループの数

は私のコードです:

import re 
string = 'suzi sabin joe brandon josh' 
print(re.search(r'^.*\b(suzi|sabin|joe|brandon|josh)\b.*$', string).group(0)) 
# output : suzi sabin joe brandon josh 

print(re.search(r'^.*\b(suzi|sabin|joe|brandon|josh)\b.*$', string).group(1)) 
# output : josh 

私は

  • なぜ唯一のグループ(1)とないグループ(1-5)があるが疑問に思って?
  • なぜジョシュはグループ(1)に分類されましたか?

私はアドバイスをいただき、ありがとうございます。

+0

グループを取得するには '('と ')を使いますが、1つしかありません。 「ジョシュ」は最後の試合だったので、最後にグループ分けされています。 – ryugie

+0

簡単で便利です。ありがとうございました! – SevO

答えて

0

group(0)を呼び出すと、一致したテキスト全体が得られます。パターンは文字列の先頭から末尾まで一致するため、文字列全体です。

すべてを一致する正規表現は、それが唯一の 1名を取り込みながら(グループ1の理由は歴史的な理由のために1から正規表現カウント)。最初の.*は欲張りです(できるだけ多くのテキストを照合しようとします)ので、それは以前の名前を酷使し、キャプチャされた名前は最後のものです"josh"(そして最後の.*は空の文字列に一致します)。キャプチャされた名前はgroup(1)に電話したときの名前です。

それぞれの名前を別々に取得する場合は、別々に処理する必要があります。おそらくこのようなものは動作します:

print(re.findall(r'\b(suzi|sabin|joe|brandon|josh)\b', string)) 

これは、リスト['suzi', 'sabin', 'joe', 'brandon', 'josh']を印刷します。それぞれの名前は、入力文字列に表示される順序と同じ順序で出力に表示されますが、パターン内の順序と同じである必要はありません。これは、あなたが探している名前の1つではないテキストをスキップするので(何にもマッチするのではなく)、あなたが望むものと正確に一致しない可能性があります。