如何提取字符串中最后一组括号

2024-04-25 23:30:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很长的字符串列表,我需要捕获最后一个或多个字符。对于简单字符串"axa""lmn"str[0]起作用。在

在某些情况下,最后一个字符可以是2中的任何一个,例如字符串“qa(n|m), 最后一个字符可以是nm。所以我需要捕获字符串中最后一组括号,并获取其中的所有内容。 在本例中,re.search('\((.*?)\)',s).group(1)给出了内容。但是,如果这个字符串有两组括号,那么它就不能工作了。在

例如:if str= "aaa(2)bbb(n|m)",我只需要'n|m'

谢谢你的帮助。在


Tags: 字符串re内容列表searchifgroup情况
3条回答

可以使用纯正则表达式方法对该正则表达式执行此操作:

\(([^)]+)\)[^)]*\Z

Demo

在Python中:

^{pr2}$

(这使得一个长字符串aaa(2)bbb(n|m0)aaa(2)bbb(n|m5000)

>>> import re
>>>> re.search(r'\(([^)]+)\)[^)]*\Z', s).group(1)
'n|m5000'

这样做的好处是只进行一个匹配,而不是像re.findall那样为每个匹配构建一个完整的列表。在

锚定匹配通常也更快。在

如果您想更快,但以可读性为代价,您可以这样做:

  1. 把绳子倒过来
  2. 匹配第一组由内向外的括号
  3. 逆转比赛。在

演示:

>>>> re.search(r'^[^)]*\)([^(]+)\(', s[::-1]).group(1)[::-1]
'n|m5000'

时间安排:

>>> import timeit
>>> timeit.timeit("re.findall('\((.*?)\)',s)[-1]", setup="from __main__ import s, re", number=1000)
2.9381589889526367000
>>> timeit.timeit("re.search(r'\(([^)]+)\)[^)]*\Z', s).group(1)", setup="from __main__ import s, re", number=1000)
1.588352918624878
>>> timeit.timeit("re.search(r'^[^)]*\)([^(]+)\(', s[::-1]).group(1)[::-1]", setup="from __main__ import s, re", number=1000)
0.27100610733032227

你可以看到反向字符串方法比其他两种方法快10倍或6倍。。。在

假设子字符串总是在末尾,您可以找到最右边的(并将其切片到末尾-1:

s = "aaa(2)bbb(n|m)"

print(s.rstrip("*")[s.rfind("(")+1:-1])
n|m

或者使用re-just-use-findall并获取最后一个元素:

^{pr2}$

rstrip将删除{}作为字符串的结尾,否则不执行任何操作。在

In [24]: s = "ee(1)bb(aaa|bbb)*"
In [25]: print(s.rstrip("*")[s.rfind("(")+1:-1])
aaa|bbb
In [26]: print(re.findall('\((.*?)\)',s)[-1])
aaa|bbb    
In [27]: s = "ee(1)bb(aaa|bbb)"    
In [28]: print(re.findall('\((.*?)\)',s)[-1])
aaa|bbb    
In [29]: print(s.rstrip("*")[s.rfind("(")+1:-1])
aaa|bbb

使用rpartition()和{}:

>>> "aaa(2)bbb(n|m)".rpartition('(')[2].partition(')')[0]
'n|m'

如果右括号总是字符串中的最后一个字符,则可以将.partition(')')[0]替换为[:-1]

^{pr2}$

相关问题 更多 >