2014-01-07 3 views
2

Я пытаюсь использовать Pyparsing в соответствии многострочную строку, которая может продолжаться таким же образом, чтобы те из питона:Python/Pyparsing - Multiline цитирует

Test = "This is a long " \ 
     "string" 

я не могу найти способ сделать Pyparsing признать это. Вот то, что я пытался до сих пор:

import pyparsing as pp 

src1 = ''' 
Test("This is a long string") 
''' 

src2 = ''' 
Test("This is a long " \ 
    "string") 
''' 

_lp = pp.Suppress('(') 
_rp = pp.Suppress(')') 
_str = pp.QuotedString('"', multiline=True, unquoteResults=False) 
func = pp.Word(pp.alphas) 

function = func + _lp + _str + _rp 
print src1 
print function.parseString(src1) 
print '-------------------------' 
print src2 
print function.parseString(src2) 

ответ

4

Проблема заключается в том, что наличие нескольких строк в кавычках строки не делать то, что вы думаете. Многострочный строка в кавычках буквально что - строка с символами новой строки внутри:

import pyparsing as pp 

src0 = ''' 
"Hello 
World 
Goodbye and go" 
''' 

pat = pp.QuotedString('"', multiline=True) 
print pat.parseString(src0) 

Выход разборе этой строки будет ['Hello\n World\n Goodbye and go'].

Насколько я знаю, если вы хотите строку, похожий на то, как строки языка Python ведут себя, вы должны определить сами:

import pyparsing as pp 

src1 = ''' 
Test("This is a long string") 
''' 

src2 = ''' 
Test("This is a long" 
    "string") 
''' 

src3 = ''' 

Test("This is a long" \\ 
    "string") 
''' 

_lp = pp.Suppress('(') 
_rp = pp.Suppress(')') 
_str = pp.QuotedString('"') 
_slash = pp.Suppress(pp.Optional("\\")) 
_multiline_str = pp.Combine(pp.OneOrMore(_str + _slash), adjacent=False) 

func = pp.Word(pp.alphas) 

function = func + _lp + _multiline_str + _rp 

print src1 
print function.parseString(src1) 
print '-------------------------' 
print src2 
print function.parseString(src2) 
print '-------------------------' 
print src3 
print function.parseString(src3) 

Это производит следующий вывод:

Test("This is a long string") 

['Test', 'This is a long string'] 
------------------------- 

Test("This is a long" 
    "string") 

['Test', 'This is a longstring'] 
------------------------- 

Test("This is a long" \ 
    "string") 

['Test', 'This is a longstring'] 

Примечание. Класс Combine объединяет различные строки с кавычками в один блок, чтобы они отображались как одна строка в выходном списке. Причина, по которой обратная косая черта подавляется так, что она не объединяется как часть выходной строки.

+0

Спасибо, это делает то, на что я надеялся! –

Смежные вопросы