\\ 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의 말씀 (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";
당신이 이것에 대해 어떤 제안이 있습니까 : (210)
이 파일에서 (원시) 문자열의 예입니다?
당신이 s''에서 일부 특수 문자를 포함하도록 질문을 편집 할 수, 그리고이 두 단계 방식으로 분석 할 경우 문제가 무엇인지 보여 ? – PaulMcG
문자열 자체에 백 슬래시 문자와 'n'문자가 실제로있는 경우'unwanted = Word ('\\', 'rnt', exact = 2)와 같은 표현식을 정의한 다음'G .ignore (원치 않는)'. – PaulMcG
멋진 해결책 인 것 같습니다. 파일을 읽은 후 파싱하기 바로 전에'\ t \ n \ r'을 공백으로 대체하는 현재의 해킹과 동등해야합니다. 감사합니다 –