Я хотел бы проанализировать список из строкового поля, которое может содержать специальные символы, такие как \\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" ;'
Изменить: вместо Word (печатные формы) в 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
и показать, в чем проблема, если вы не выполняете синтаксический анализ таким двухэтапным способом? - person PaulMcG   schedule 07.12.2012unwanted = Word('\\','rnt',exact=2)
, а затем выполнитеG.ignore(unwanted)
. - person PaulMcG   schedule 07.12.2012\t \n \r
пробелом сразу после чтения файла и перед его разбором. Спасибо - person Vu Nguyen   schedule 07.12.2012