首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python -返回第一组嵌套括号中的所有子字符串

Python -返回第一组嵌套括号中的所有子字符串
EN

Stack Overflow用户
提问于 2015-04-22 22:59:29
回答 2查看 487关注 0票数 2

我希望找到一种有效的方法,从字符串中选择嵌套括号的第一组中包含的所有子字符串。

例如:

代码语言:javascript
运行
复制
input: a d f gsds ( adsd ) adsdaa    
output: ( adsd )

input: adadsa ( sadad adsads ( adsda ) dsadsa ) ( dsadsad ) 
output: ( sadad adsads ( adsda ) dsadsa )

intput: a ana anan anan ( adad ( sad ) sdada asdad ) ( sadad ( adasd ) asda ) sdafds ( afdasf )
output: ( adad ( sad ) sdada asdad )

注意,可能有多组嵌套括号。

一个解决方案将通过char扫描字符串char,并跟踪打开的括号的数量,直到计数器再次变为0为止(一旦有结束括号,则会减少该数目)。

我想知道是否有更简单的方法做这件事?可能有正则表达式吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-23 00:28:08

我写了一个小函数:

代码语言:javascript
运行
复制
def parens(s):
    i=s[s.find('('):s.find(')')].count('(')   #counts number of '(' until the first ')'
    groups = s[s.find('('):].split(')')       #splits the string at every ')'
    print ')'.join(groups[:i]) +')'           #joins the list with ')' using the number of counted '('

演示:

代码语言:javascript
运行
复制
>>> parens('a d f gsds ( adsd ) adsdaa')
( adsd )

>>> parens('adadsa ( sadad adsads ( adsda ) dsadsa ) ( dsadsad )')
( sadad adsads ( adsda ) dsadsa )

>>> parens('a ana anan anan ( adad ( sad ) sdada asdad ) ( sadad ( adasd ) asda ) sdafds ( afdasf )')
( adad ( sad ) sdada asdad )
票数 2
EN

Stack Overflow用户

发布于 2022-02-05 09:40:35

可以使用pyparsing从字符串中选择第一组嵌套括号中包含的所有子字符串。

代码语言:javascript
运行
复制
import pyparsing as pp

pattern = pp.Regex(r'.*?(?=\()') + pp.original_text_for(pp.nested_expr('(', ')'))

txt = 'a d f gsds ( adsd ) adsdaa'
result = pattern.parse_string(txt)[1]
assert result == '( adsd )'

txt = 'adadsa ( sadad adsads ( adsda ) dsadsa ) ( dsadsad )'
result = pattern.parse_string(txt)[1]
assert result == '( sadad adsads ( adsda ) dsadsa )'

txt = 'a ana anan anan ( adad ( sad ) sdada asdad ) ( sadad ( adasd ) asda ) sdafds ( afdasf )'
result = pattern.parse_string(txt)[1]
assert result == '( adad ( sad ) sdada asdad )'

* pyparsing可以由pip install pyparsing安装

注意:

如果() (例如,a(b(c)a(b)c)等)中的一对括号被打断,则会获得意外的结果或引发IndexError。所以要小心。(见:Python extract string in a phrase)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29810464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档