我希望找到一种有效的方法,从字符串中选择嵌套括号的第一组中包含的所有子字符串。
例如:
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为止(一旦有结束括号,则会减少该数目)。
我想知道是否有更简单的方法做这件事?可能有正则表达式吗?
谢谢
发布于 2015-04-23 00:28:08
我写了一个小函数:
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 '('
演示:
>>> 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 )
发布于 2022-02-05 09:40:35
可以使用pyparsing
从字符串中选择第一组嵌套括号中包含的所有子字符串。
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)
https://stackoverflow.com/questions/29810464
复制相似问题