\ \ 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";
これについて何か提案はありますか?