我希望能够从一段文字中提取字母的类型和数量,其中字母可以是任何顺序.还有一些其他的解析正在进行中,但这一点让我难过!
input -> result
"abc" -> [['a',1], ['b',1],['c',1]]
"bbbc" -> [['b',3],['c',1]]
"cccaa" -> [['a',2],['c',3]]
Run Code Online (Sandbox Code Playgroud)
我可以使用搜索或扫描并重复每个可能的字母,但有一个干净的方式吗?
这是我得到的:
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()
Run Code Online (Sandbox Code Playgroud)
一个解决方案
text = 'sufja srfjhvlasfjkhv lasjfvhslfjkv hlskjfvh slfkjvhslk'
print([(x,text.count(x)) for x in set(text)])
Run Code Online (Sandbox Code Playgroud)
没有涉及pyparsing,但似乎有点矫枉过正.
我从描述中不清楚输入字符是否可以像"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()
Run Code Online (Sandbox Code Playgroud)
每个构造负责按顺序进行匹配,而Word(ch)处理1到n的重复.解析操作负责将解析的标记转换为(字符,计数)元组.
归档时间: |
|
查看次数: |
941 次 |
最近记录: |