2つのフォローコードブロックがテストケースで異なる結果をもたらす理由はわかりません。最初のコードブロックは期待通りに2016を返しますが、小さな変更を加えると2番目のコードブロックはNoneを返します。予期しない結果を返すPython 3の正規表現
ここで、 "(uary)?" 私は追加し、その後
import re
date = '24 Jan 2016'
def func(line):
month_regex = re.search('(\d{1,2})\s(Jan)\s(\d{2,4})', line)
if month_regex:
year = month_regex.group(3)
return year
func(date)
を期待通りに '2016' を返す最初のもの、です正規表現に何らかの理由で、Noneを返します。どちらの場合も、グループ(1)とグループ(2)の結果は同じであることに注意してください。
import re
date = '24 Jan 2016'
def func(line):
month_regex = re.search('(\d{1,2})\s(Jan(uary)?)\s(\d{2,4})', line)
if month_regex:
year = month_regex.group(3)
return year
func(date)
なぜ2番目のコードブロックがNoneを返すのですか?
最初のスニペットは年を返します。 https://ideone.com/1v7FQeを参照してください。 3番目のグループが一致しなかったため、2番目のスニペット([None')](https://ideone.com/BWIkcq)が返されます。あなたの最終目標は何ですか?年を返す?それから[2番目のスニペットで '.group(4)'を使う](https://ideone.com/6qT6Jr)。 –
3番目のグループが一致しないのはなぜですか? \ d {2,4}は2016にマッチしませんか? – jss367
しかし、 '(uary)?' *は**キャプチャ**グループであり、ID = 3(パターンの3番目のキャプチャグループなので)に割り当てられます。 '(\ d {2,4})'は第4グループです。 –