我想使用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',''],{})
你能看看为什么会这样吗?
答案 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 不允许包含“{}”字符。