2016-03-22 3 views
1

正規表現操作に固執しています。私はオプションの正規表現操作

a I get output '11 Oct 1990' 
b I get output 'Oct 1990' 
c I get output '1990' 
のために、このような表現を書きたい、私は

a = '(sam was born on 11 Oct 1990)' 
b = 'sam was born on Oct 1990' 
c = 'sam was born on 1990' 

以下に示すように、b、cの3つの文字列を持っている文字列

で日付を見つけるために、オプションの式を記述しようとしています

aとbの正しい出力を取り出すことができますが、私はできません。しかし、私がCを

に変更すると、
c = 'sam was born on 1990' -- with two spaces between on and 1990 

私は正しい出力を取り出します。

私が使用して正規表現は次のとおりです。

print re.findall(r"((11)?[\s\(](((Nov|Oct))?([\s\(-]|,\s)(1990|1991)))", a) 

私はフェッチ出力は次のとおりです。

Output for a : [('11 Oct 1990', '11', 'Oct 1990', 'Oct', 'Oct', ' ', '1990')] 
Ouptut for b : [(' Oct 1990', '', 'Oct 1990', 'Oct', 'Oct', ' ', '1990')] 
Ouptut for c : [] 

任意の助けをいただければ幸いです。ありがとう

+1

regex101.comのような正規表現の設計に役立つサイトをご覧ください。 – asimoneau

+0

オンライン正規表現サイト、特にregexr.comとregex101.comでの時間。彼らは肥大化し、遅く、エラーが発生します。 – sln

答えて

1

あなたはこれを使用することができます:

regex = re.compile(r'((?:11)?[\s\(](?:(?:(?:Nov|Oct))?(?:[\s\(?:-]|,\s)?(?:1990|1991)))') 

それはあなたのものとまったく同じだが、非キャプチャブロックと、唯一の外側の1は

+0

ありがとう,,,,,たくさん.. – Sam

0

日付の前に\sは必要ありません。これにより、あなたの望む出力が得られます。

print re.findall(r"((11)?[\s\(](((Nov|Oct))?([\s\(-]|)(1990|1991)))", c) 
+0

こんにちはBorja、応答のおかげで、私は10月の後にコンマを持っている(samは、1990年10月11日に生まれた)のようなケースを処理するために(、\ s)を与えた – Sam

+0

あなたはその投稿を指定していません。入力には昏睡がありません。 –

0

別のアプローチキャプチャ(多分単純に?):

on\s([^)\n]+)\)?$ 
# match on literally 
# a whitespace 
# followed by anything NOT a closing parenthesis or newline (save this to Group 1) 
# followed by an optional parenthesis 
# bind the Expression to the end of the line 

これは、前にonとオプションの)を探してください。 multilineモードを使用する必要があります(working on regex101.comを参照)。

0

これが動作するかどうかを確認してください:

str=re.findall(r'([\d]{0,2}\s*?[a-zA-Z]*?\s*[\d]{4}',a) 
0

を、私はこれは良いと明確な選択肢だと思う:あなたは、文字列で複数の日付を持っている場合

found = re.findall(r"(11\s)?(Nov\s|Oct\s)?(1990|1991)", a) 

は、次に、あなただけ印刷することができます。

for date in found: 
    print ''.join(date) 
関連する問題