gpt4 book ai didi

pyparsing中的python正则表达式

转载 作者:行者123 更新时间:2023-11-28 22:02:30 29 4
gpt4 key购买 nike

如何在 pyparsing 中使用以下正则表达式?它应该返回给定正则表达式的 token 列表。

任何帮助将不胜感激!谢谢!

shell 中的 python 正则表达式示例:

>>> re.split("(\w+)(lab)(\d+)", "abclab1", 3)
>>> ['', 'abc', 'lab', '1', '']

我在 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()

最佳答案

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']

这会进行正确的分组和检测,但不会暴露组本身。为此,向每个组添加名称 - 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'}

我能想到的唯一其他非正则表达式方法是定义一个表达式来读取整个字符串,然后在解析操作中分解各个部分。

关于pyparsing中的python正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11116336/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com