我有这个字符串:
>>> s = 'Evolution Recruitment (Agency) (London, UK)'
我想得到这部分:
London, UK
请记住,对于真实案例,我正在处理第一个括号(agency)
不一定在字符串中。
我试过了:
>>> import re
>>> re.findall("\((.*?)\)$", s)
['Agency) (London, UK']
如果我能够让正则表达式从右向左而不是从左向右读取,则此解决方案应该可行。
这可能吗?如果没有,是否有另一种方法来获取部分London, UK
?
答案 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)']
您也可以将其锚定到字符串($
)的末尾,也可以使其更安全。