0

我有这个字符串:

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

我想得到这部分

London, UK

请记住,对于实际情况,我正在处理的第一个括号(agency)不一定在字符串中。

我试过这个

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

如果我能够让正则表达式从右到左而不是从左到右读取,那么这个解决方案应该可以工作。

那可能吗?如果没有,还有其他方法可以得到零件London, UK吗?

4

4 回答 4

2

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

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

于 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)
['(London, UK)']

您也可以将其添加到字符串 ( ) 的末尾$,这可能会使其更加安全。

于 2012-12-18T14:32:02.960 回答
1

这似乎有效:

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

它也适用于re.search

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

用它的话来说,寻找一个(然后开始捕获任何不是a的东西,)直到你看到a ),然后停止捕获。仅当该行在)-- 之后结束时才保留它,否则,它不算作匹配。

于 2012-12-18T14:31:36.010 回答