2017-02-07 6 views
1

私は、スペースで始まりスペースの後にスペースで終わる特定の単語に対して、正規表現を使用して文字列を検索しようとしています。私が検索したい問題の文字列は、スペースで文字列を返す正規表現を検索する

JAKARTA, INDONESIA (1 February 2017) 

と私はそれにrtrimltrimを適用することができるように", INDONESIA ("一部を取り戻すしたいです。私はイギリスに戻ることもできました。

私はこのコードを私のPythonコードの中に書き込もうとしました。

import re 
text = "JAKARTA, INDONESIA (1 February 2017)" 
countryRegex = re.compile(r'^(,)(\s)([a-zA-Z]+)(\s)(\()$') 
mo = countryRegex.search(text) 
print(mo.group()) 

しかしこれは

AttributeError: 'NoneType' object has no attribute 'group' 

は私がどんなマッチしたオブジェクトを返すわけではないことを私に示された結果を出力します。

私はregex 101で正規表現を使用しようとしましたが、「あなたの正規表現が件名の文字列と一致しません」というエラーが返されます。

私は、スペース(\s)その後、私はリテラルのカンマ(,)をテストとしてこれがうまくいくと仮定1つの以上の文字([a-zA-Z]+)、その後、別のスペース(\s)と、最終的に開口部ブラケットは、私が持っていることを確認することそれをエスケープしました(\()。私の正規表現に何か問題がありますか?

+1

'^'と '$'アンカーを削除する必要があります。 –

+0

そして '^'アンカーも。 – Toto

+0

@WiktorStribiżewこれはうまくいきました。なぜそれを説明することが可能でしょうか? – mp252

答えて

1

アンカーを削除すると(^が文字列位置の開始に一致し、$が文字列位置の終わりに一致します)、正規表現は文字列と一致します。ただし、使用してキャプチャグループとINDONESIAを得ることができます:

,\s*([a-zA-Z]+)\s*\(

regex demoを参照してください。 match.group(1)には値が入ります。

詳細

  • ,\s* - コンマと0個以上の空白(あなたは、少なくとも1つの空白が存在になりたい場合は+*を置き換える)
  • ([a-zA-Z]+) - 1にマッチした取り込みグループ1またはより多くのASCII文字
  • \s*ゼロ以上の空白
  • \( - (リテラルシンボル。

Sample Python code

import re 
text = "JAKARTA, INDONESIA (1 February 2017)" 
countryRegex = re.compile(r',\s*([a-zA-Z]+)\s*\(') 
mo = countryRegex.search(text) 
if mo: 
    print(mo.group(1)) 

空白や空白+ ( + ,の間に何かを捉えるだろう代替正規表現は

,\s*([^)]+?)\s*\(

ではthis regex demoを参照してください。ここでは、[^)]+?は、)以外の1文字以上の文字とできるだけ一致しません。

2

LookouthindとLookaheadを使ってこの正規表現を使用して、State部分にのみ一致するようにすることができます。
リストにスペースを追加すると、英国などの州に一致するのに役立ちます。

(?<=,)([a-zA-Z ]+)(?= \() 

Test on Regex101

+0

キャプチャを使用してルックアラウンドを混在させるので、ルックアラウンドをまったく気にしないのはなぜですか? –

+0

私はそれが必要以上に多くのテキストをキャプチャするよりも良いと思うので、Lookaroundを使用します。キャプチャグループは、マッチの代わりにグループを使用する場合に備えて追加されます。 –

関連する問題