我希望能够从一段文本中提取出字母的类型和数量,其中字母可以按任何顺序排列。我正在进行其他一些解析工作,但这一点让我感到难过!
input -> result
"abc" -> [['a',1], ['b',1],['c',1]]
"bbbc" -> [['b',3],['c',1]]
"cccaa" -> [['a',2],['c',3]]
我可以对每个可能的字母使用搜索或扫描并重复,但有一种干净的方法吗?
据我所知:
from pyparsing import *
def handleStuff(string, location, tokens):
return [tokens[0][0], len(tokens[0])]
stype = Word("abc").setParseAction(handleStuff)
section = ZeroOrMore(stype("stype"))
print section.parseString("abc").dump()
print section.parseString("aabcc").dump()
print section.parseString("bbaaa").dump()
最佳答案
从你的描述中我不清楚输入字符是否可以像“ababc”那样混合,因为在你所有的测试用例中,字母总是组合在一起。如果字母 总是组合在一起,您可以使用此 pyparsing 代码:
def makeExpr(ch):
expr = Word(ch).setParseAction(lambda tokens: [ch,len(tokens[0])])
return expr
expr = Each([Optional(makeExpr(ch)) for ch in "abc"])
for t in tests:
print t,expr.parseString(t).asList()
Each 结构负责乱序匹配,而 Word(ch) 处理 1 对 n 的重复。解析操作负责将解析的标记转换为(字符,计数)元组。
关于python - Pyparsing - token 的顺序不可预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2134416/