0

私はこの文字列を持っています:

>>> s = 'Evolution Recruitment (Agency) (London, UK)'

この部分を取得したい

London, UK

実際のケースでは、最初の角かっこ(agency)は必ずしも文字列に含まれているとは限らないことに注意してください。

私はこれを試しました

>>> import re
>>> re.findall("\((.*?)\)$", s)
['Agency) (London, UK']

正規表現を左から右ではなく右から左に読み取らせることができれば、このソリューションは機能するはずです。

それは可能ですか?そうでない場合、部品を入手する別の方法はありLondon, UKますか?

4

4 に答える 4

2

に置き換える場合は、最後の角かっこのセットの内容のみをキャプチャする必要があります.*?[^(]*

)(これは右から左に読む方が効率的です。正規表現を使用せずに、手動で最後の文字をチェックし、の最後のインデックスを見つけて、(部分文字列を使用する方がよいでしょう。2つの間のコンテンツを取得するには?)

于 2012-12-18T14:30:41.367 に答える
2
In [8]: re.search(r".*[(](.*)[)]", s).groups()
Out[8]: ('London, UK',)

貪欲な.*一致を使用して、最後の括弧のセットを取得します。

または、一致するすべての括弧を見つけて、最後のペアを使用することもできます。

In [14]: re.findall(r'\(.*?\)', s)[-1]
Out[14]: '(London, UK)'

正規表現のアプローチは非常に柔軟です。ただし、入力の整形式がわかっていて、最後の括弧のセット内にテキストが必要な場合は、次のようにします。

In [11]: s[s.rfind('(')+1:s.rfind(')')]
Out[11]: 'London, UK'

これは文字列を右から左にスキャンするので、かなり効率的である可能性があります(私は何でもプロファイルしたので、それは単なる推測です)。

于 2012-12-18T14:31:33.993 に答える
1

これはうまくいくようです:

re.findall(r"\(([^\)]+)\)$", s)

そしてそれは同様に動作しre.searchます:

re.search(r"\(([^\)]+)\)$", s).group(0)

つまり、それを探して、その時点で表示されるまで(ではないものをキャプチャし始め、キャプチャを停止します。行が--の後に終了する場合にのみ保持します。それ以外の場合は、一致としてカウントされません。)))

于 2012-12-18T14:31:36.010 に答える
1

文字をスキップし、スキップ後に括弧付きのグループを作成します。

>>> re.findall(r'.+(\(.+\))', s)
['(London, UK)']

これを文字列($)の最後まで確認することもできます。これにより、さらに安全になる可能性があります。

于 2012-12-18T14:32:02.960 に答える