Python如何用Regex/re正则提取字符串最后一对括号内的内容
实现思路
核心利用正则贪婪匹配特性+题目给出的固定前提:所有待处理字符串均以目标括号的闭合符)结尾,不需要写复杂的递归嵌套匹配规则,只要锚定字符串末尾,让贪婪通配符自动定位到最后一对最外层括号的起始位置即可。
可直接运行的代码
import re possible_strings = [ "some text (and words) more text (and words)", "textrighthere(with some more)", "little trickier (this time) with (all of (the)(values))" ] # 正则规则:匹配到末尾的最外层括号,提取内部内容 # re.DOTALL 让.可以匹配换行符,兼容括号内有换行的场景 extractor = re.compile(r'.*\((.*)\)$', re.DOTALL) output = [extractor.match(s).group(1) for s in possible_strings] print(output) # 运行结果:['and words', 'with some more', 'all of (the)(values)']
规则解释
.*:贪婪匹配任意长度的前缀内容,会尽可能向后吞噬字符,直到剩余部分刚好满足后续匹配规则,自动定位到最后一个最外层左括号(的位置\(:匹配定位到的最外层左括号(.*):捕获组,匹配括号内部的所有内容(包括内部嵌套的括号)\)$:锚定字符串末尾的右括号,确保匹配的是整串最后一个闭合括号,不会误匹配中间的括号对
异常兼容处理
如果输入可能存在不符合前提的异常字符串(比如末尾不是括号、括号未闭合),可以加判断避免报错:
def get_last_bracket_content(s: str): match_res = extractor.match(s) return match_res.group(1) if match_res else None
如果没有「字符串以括号结尾」的前提、需要处理任意位置的最后一个嵌套括号,标准库re不支持递归匹配,需要换用第三方regex库实现递归规则,但当前题目场景下上述简单写法效率更高、可读性更好。
内容的提问来源于stack exchange,提问作者T.J. Kolberg
相关产品推荐
相关产品推荐

