正则表达:从“Evolution Recruitment(Agency)(英国伦敦)”获取“伦敦,英国”

时间:2012-12-18 14:28:52

标签: python regex

我有这个字符串:

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

我想得到这部分

London, UK

请记住,对于真实案例,我正在处理第一个括号(agency)不一定在字符串中。

我试过了

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

如果我能够让正则表达式从右向左而不是从左向右读取,则此解决方案应该可行。

这可能吗?如果没有,是否有另一种方法来获取部分London, UK

4 个答案:

答案 0 :(得分:2)

如果将.*?替换为[^(]*,则只应捕获最后一组括号的内容。

(你是对的,从右到左阅读会更有效 - 也许你最好不要使用正则表达式,但手动检查最后一个字符是),找到(的最后一个索引,并使用substring来获取两者之间的内容?)

答案 1 :(得分: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'

这会从右到左扫描字符串,因此可能相当有效(我已经分析过任何内容,所以这只是一种推测)。

答案 2 :(得分:1)

这似乎有效:

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

它也适用于re.search

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

用文字说,找(然后开始捕捉任何不是)的内容,直到你看到)为止,停止捕捉。只有当行在)之后结束时才保留 - 否则,它不算作匹配。

答案 3 :(得分:1)

只需跳过字符,跳过后就会有一个带括号的组:

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

您也可以将其锚定到字符串($)的末尾,也可以使其更安全。