[英]Python regex split into characters except if followed by parentheses
我有一个字符串,如"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 list(filter(None, <list>))
用于从结果中删除空字符串。
我知道这可能是因为Python的re.split
被设计为不分割为零长度匹配, 如此 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',
']',
']']
[^()]
匹配除括号外的单个字符; (?:\\([^()]*\\))?
表示由一对括号括起来的非捕获组( ?:
:)并使用?
使小组成为可选的; 另一种方法。 这次模式识别具有SYMBOL [(NUMBER [,NUMBER ...])]结构的字符串。 如果字符串与正则表达式匹配,则函数parse_it
返回True和标记,如果不匹配,则返回False和空。
import re
def parse_it(string):
'''
Input: String to parse
Output: True|False, Tokens|empty_string
'''
pattern = re.compile('[A-Za-z\[\]\+\-\^\&\\\/%_;~](?:\(\d+(?:,\d+)*\))?')
tokens = pattern.findall(string)
if ''.join(tokens) == string:
res = (True, tokens)
else:
res = (False, '')
return res
good_string = 'F(230,24)F[f(22)_(23);(2)%[+(45)FF]]'
bad_string = 'F(2a30,24)F[f(22)_(23);(2)%[+(45)FF]]' # There is an 'a' in a bad place.
print(parse_it(good_string))
print(parse_it(bad_string))
输出:
(是的,['F(230,24)','F','[','f(22)','_(23)',';(2)','%','[', '+(45)','F','F',']',']'])
(假,'')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.