从PyParsing中的多行引用字符串中删除\n

2024-10-01 15:44:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在分析一个带引号的多行字符串,如下所示:

包含字符串(test.txt)的文件:

PROPERTY PName "Multiline quoted 
string" ;

Python代码:

linebreak = pp.Suppress(';')
identifier = pp.Word(pp.alphanums + '._!<>/[]$')
qs = pp.QuotedString('"', multiline = True)

ifile = open("test.txt",'r')
test_string = ifile.read()
ifile.close()

PROPERTY = (pp.Suppress(pp.Keyword('PROPERTY'))
            + identifier('propName')
            + qs('propValue')
            + linebreak
           )

for t, s, e in PROPERTY.scanString(test_string):
    t.asDict()

由此产生:

"PROPERTY": {
        "propName": "PName",
        "propValue": "Multiline quoted \n   string"
      }

是否可以在解析期间删除'\n'


Tags: 字符串testtxtstringpropertyppmultilineidentifier
2条回答

结果我找到了解决办法。它可以作为一个例子,因为在用户指南中没有

只需在qs中插入escChar='\n'

qs = pp.QuotedString('"', multiline = True, escChar='\n')

由此产生:

"PROPERTY": {
        "propName": "PName",
        "propValue": "Multiline quoted    string"
      }

这并不是escChar参数的真正用途,而是指示如何转义通常是引号分隔符的嵌入字符

这是我认为最好用parse操作来处理的,parse操作是一个解析时间回调,它可以在解析令牌之后,但在它们返回给调用者之前修改它们。以下是作为控制台会话的代码,将解析操作remove_newlines添加到qs

>>> text = """PROPERTY PName "Multiline quoted 
... string" ;"""
>>> import pyparsing as pp

>>> qs = pp.QuotedString('"', multiline=True)

>>> qs.searchString(text)
([(['Multiline quoted \nstring'], {})], {})

>>> def remove_newlines(t):
...     t[0] = t[0].replace('\n', '')
...     
>>> qs.addParseAction(remove_newlines)

>>> qs.searchString(text)
([(['Multiline quoted string'], {})], {})

在成功解析qs之后调用remove_newlines方法,生成的标记作为t参数传递给该方法。我们可以在适当的地方修改这些标记。在这个方法中,换行符被替换为空字符串,然后重新分配到标记中,对它们进行适当的修改

相关问题 更多 >

    热门问题