我想从可能包含特殊字符(例如 \ \n \r \n \t )的字符串字段中解析一个列表,并展开多行。目前,我必须先解析字符串,清理它,然后在那个干净的字符串上应用列表语法。它工作正常,但只是想知道是否有更好的方法。
这就是我目前拥有的
str_ = QuotedString('"',escChar='\\',multiline=True) #grammar for str
str_.setParseAction(lambda pr: pr[0].replace('\\n',' ')\
.replace('\\r', ' ')\
.replace('\r', ' ')\
.replace('\t', ' '))
list_G = delimitedList(Word(printables))('mlist') #grammar for list
def pa(st,locn,pr): return list_G.parseString(pr.mystr)
mylist = Group(str_('mystr').addParseAction(pa)) #read in the str then re-parse
G = Keyword("LIST") + mylist('thelist') + ';' #grammar for the whole thing
s = 'LIST "one,two,three" ;'
编辑:而不是 list_G 中的 Word(printables),改为
var_grammar = Word(alphas+"_", alphanums + "_") #"_a,a2b_,.."
num_grammar = Regex(r"[+-]?\d+(:?\.\d*)?(:?[eE][+-]?\d+)?")('num')
list_G = delimitedList(var_grammar|num_grammar)('mlist') #grammar for list
G = Keyword("LIST") + '"' + mylist('thelist') + '"' + ';'
迫使我进行上面替换的清理的原因"\\n", "\\r" with ' '
是因为我从一个字面上包含字符的文件中读取了字符串,\n, \r
而这些字符不能被 var_name 或 num 解析(它们不可打印)
这是文件中(原始)字符串的示例:
LIST "one,two,
three,
\nfour,\rfive";
你对此有什么建议吗?