我有一个类似的字符串"F(230,24)F[f(22)_(23);(2)%[+(45)FF]]"
,其中除括号外的每个字符及其所包围的内容都代表一种指令。字符后可以跟可选括号中指定的可选参数列表。
这样的字符串我想将其拆分为['F(230,24)', 'F', '[', 'f(22)', '_(23)', ';(2)', '%', '[', '+(45)', 'F', 'F', ']', ']']
,但是此刻我只能得到['F(230,24)', 'F', '[', 'f(22)_(23);(2)', '%', '[', '+(45)', 'F', 'F', ']', ']']
(子字符串未正确拆分)。
目前我正在使用list(filter(None, re.split(r'([A-Za-z\[\]\+\-\^\&\\\/%_;~](?!\())', string)))
,这只是一堆乱七八糟的字符和一个负面的展望(
。list(filter(None, <list>))
用于从结果中删除空字符串。
我知道这很可能是由于Python的re.split
设计不按零长度匹配进行拆分,如此处所述。但是我想知道什么是一个好的解决方案?有没有比这更好的方法re.findall
?
谢谢你。
编辑:不幸的是我不允许使用自定义程序包,如regex
模块
您可以使用re.findall
查找所有单个字符(可选),并在其后加上一对括号:
import re
s = "F(230,24)F[f(22)_(23);(2)%[+(45)FF]]"
re.findall("[^()](?:\([^()]*\))?", s)
['F(230,24)',
'F',
'[',
'f(22)',
'_(23)',
';(2)',
'%',
'[',
'+(45)',
'F',
'F',
']',
']']
[^()]
匹配单个字符(括号除外);(?:\([^()]*\))?
表示?:
由一对括号括起来的非捕获组(),用于?
使该组成为可选的;本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句