use*_*650 2 python regex pyparsing
你如何使下面的正则表达式用于pyparsing?它应该返回给定正则表达式的标记列表.
任何帮助将不胜感激!谢谢!
shell中的python正则表达式示例:
>>> re.split("(\w+)(lab)(\d+)", "abclab1", 3)
>>> ['', 'abc', 'lab', '1', '']
Run Code Online (Sandbox Code Playgroud)
我在pyparsing中尝试了这个,但我似乎无法弄清楚如何正确,因为第一个匹配是贪婪的,即第一个令牌将是'abclab'而不是两个令牌'abc'和'lab'.
pyparsing示例(高级别,即非工作代码):
name = 'abclab1'
location = Word(alphas).setResultsName('location')
lab = CaselessLiteral('lab').setResultsName('environment')
identifier = Word(nums).setResultsName('identifier')
expr = location + lab + identifier
match, start, end = expr.scanString(name).next()
print match.asDict()
Run Code Online (Sandbox Code Playgroud)
Pyparsing的类几乎是从左到右,使用显式表达式实现前瞻,如FollowedBy(对于正向前瞻)和NotAny或'〜'运算符(对于负向前瞻).这允许您检测通常与正在重复的项匹配的终结符.例如,OneOrMore(Word(alphas)) + Literal('end')永远不会在"start blah blah end"这样的字符串中找到匹配项,因为终止"end"将在OneOrMore中的重复表达式中被吞噬.修复是在重复的表达式中添加负向前瞻:OneOrMore(~Literal('end') + Word(alphas)) + Literal('end')- 也就是说,在读取由alpha组成的另一个单词之前,首先要确保它不是单词'end'.
当重复在一个pyparsing类(如Word)中时,这会崩溃.Word(alphas)只要没有空格来停止单词,它将继续读取字母字符.你必须使用非常昂贵的东西来闯入这个重复,比如Combine(OneOrMore(~Literal('lab') + Word(alphas, exact=1)))- 我说昂贵,因为使用复杂的Combine表达式的简单令牌的组合将使得缓慢的解析器.
您可以通过使用包装在pyparsing Regex对象中的正则表达式来妥协:
>>> labword = Regex(r'(\w+)(lab)(\d+)')
>>> print labword.parseString("abclab1").dump()
['abclab1']
Run Code Online (Sandbox Code Playgroud)
这可以进行正确的分组和检测,但不会暴露组本身.为此,请为每个组添加名称 - pyparsing会将这些名称视为结果名称,并允许您访问各个字段,就像调用setResultsName一样:
>>> labword = Regex(r'(?P<locn>\w+)(?P<env>lab)(?P<identifier>\d+)')
>>> print labword.parseString("abclab1").dump()
['abclab1']
- env: lab
- identifier: 1
- locn: abc
>>> print labword.parseString("abclab1").asDict()
{'identifier': '1', 'locn': 'abc', 'env': 'lab'}
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一其他非正则表达式方法是定义一个表达式来读取整个字符串,然后在解析操作中分解这些部分.
| 归档时间: |
|
| 查看次数: |
1656 次 |
| 最近记录: |