我想從可能包含特殊字符(如\\ n \ r \ n \ t)的字符串字段中解析列表,並在多行中展開。目前,我必須首先解析字符串,將其清理乾淨,然後將清單語法應用於該清理字符串。它工作正常,但只是想知道是否有更好的方法。使用pyparsing從特殊字符的字符串中解析列表
這是我目前有
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" ;'
編輯: 相反字(printables)在list_G的,改爲
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";
你對此有什麼建議嗎?
您可以編輯您的問題,包括在's'一些特殊字符,並顯示問題是什麼,如果你沒有在這兩個步驟的方式解析? – PaulMcG
如果實際上字符串本身具有反斜槓和'n'字符,則定義一個表達式,如'unwanted = Word('\\','rnt',exact = 2)',然後執行'G .IGNORE(不想要的)'。 – PaulMcG
這似乎是一個很好的解決方案 - 應該等同於當前我的黑客攻擊,在讀入文件之後並解析之前,用空格替換那些「\ t \ n \ r」。謝謝 –