0

分類の問題の日付を見つけるためにいくつかのドキュメントをスキャンしようとしています。この辺りや他の場所を読んだ後、私は次の正規表現を作成しました

months='['+'|'.join(calendar.month_abbr[1:])+'|'+'|'.join(calendar.month_name[1:])+']'
techPart='+\\.*\\s*\\d{1,2}[,]?[\\s*][1|2]\\d{3}'
dateExpr=months+techPart

この文字列でテストしています

newString='Mar. 31, 2011 Dec. 31, 2010 bananas Mar. 31, 2011 too much malarky September 1, 1992 redundant Dec. 31, 2010  September 29, 1999  March 12 2004 ddfd  March.    13 2019 ddfd  Mac.    13 2019 ddfd'

そして私がこのようにそれを実行すると

for date in re.findall(dateExpr,newString):
print date

私はこれを手に入れます

Mar. 31, 2011
Dec. 31, 2010
Mar. 31, 2011
September 1, 1992
Dec. 31, 2010
September 29, 1999
March 12 2004
March.    13 2019
Mac.    13 2019    #here is my problem
4

1 に答える 1

6

months正規表現では、角かっこを使用して、のようなものを指定しています[Jan|Feb|Mar|...]。それは間違いです。角かっこは文字クラス用であり、角かっこ内の任意の文字の1つとJ一致するため、 oraまたはornまたは|orFなどと一致します。代わりにかっこを使用します。

months='(?:'+'|'.join(calendar.month_abbr[1:])+'|'+'|'.join(calendar.month_name[1:])+')'

?:キャプチャされたグループのみが返されるためfindall、このグループを非キャプチャとしてマークする必要があります。

後の正規表現で同じ問題が発生します[1|2]。あなたが欲しい(?:1|2)、またはただ[12]

于 2012-09-29T20:11:50.140 に答える