【发布时间】:2016-07-27 18:30:01
【问题描述】:
我有一个类似"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 被设计为不会在零长度匹配 as discussed here 上拆分造成的。
但是我想知道什么是一个好的解决方案?有没有比re.findall更好的办法?
谢谢。
编辑:不幸的是,我不允许使用像 regex module 这样的自定义包
【问题讨论】:
-
你的正则表达式是什么?包括您这样做的原因也可能会有所帮助,因为可能有更简单的方法。
-
抱歉完全忘记在行之间包含它!
-
你可以只做
re.findall(s, "([^()](\\([^)]+\\))?)")(将[^()]替换为你想要的所有字符) -
参数只是逗号分隔的数字吗?
-
现在是的。但事实上它们将来也可能是字符串,所以我想我对
findall方法更满意。