pyparsing,ignore不能忽略字符串内联

时间:2014-07-14 05:25:04

标签: python pyparsing

我想使用pyparsing的commaSeparatedList分隔一个字符串并忽略其中的工作人员' {' '}'

示例:

a = 'xyz,abc{def,123,456}'
解析后,我想得到 [' XYZ',' ABC DEF {,} 123456']

我写了这个:

 nested_expr = '{' + SkipTo('}') + '}'
 commaSeparatedList.ignore(nested_expr).parseString(a)

结果:([' xyz',' abc {def',' 123',' 456}'],{} )

Actulally 看起来好像之前有一个分隔符' {',这将起作用

a = 'xyz,abc,{def,123,456}'
commaSeparatedList.ignore(nested_expr).parseString(a)

结果:([' xyz',' abc',''],{})

你能看看为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

打开pyparsing.py源文件,看看如何实现commaSeparatedList - 它不是那么多,并且很容易适应你的情况:

# original
_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') +
                                  Optional( Word(" \t") +
                                            ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem")
commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList")


# modified
_commasepitem = Combine(OneOrMore(QuotedString('{',endQuoteChar='}',unquoteResults=False) | Word(printables, excludeChars=',{}') +
                                  Optional( Word(" \t") +
                                            ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem")

commaSeparatedList = delimitedList( Optional(_commasepitem, default="") ).setName("commaSeparatedList")

重要的是_commasepitem 中的Word 不允许包含“{}”字符。