python - 使用停止标记解析字符串

标签 python pyparsing

假设解析器接受字母 abc 以及三者的任意组合。我想使用满足以下条件的子字符串调用函数:

  1. 子字符串以 a 开头
  2. 子字符串在遇到 abc 之前终止
  3. 子字符串不以 abc 开头

例如我们有以下字符串:

bb cc ab bc cb bc abc bca bbb acc cbc ccc abc

我想使用字符串 ab bc cbacc cbc ccc 调用该函数

我尝试按如下方式实现:

import pyparsing as pp

x = pp.OneOrMore(pp.Word("abc") + ~pp.Literal("abc"))
x.addCondition(lambda tokens: tokens[0] != "abc")
x.addCondition(lambda tokens: tokens[0][0] == "a")
x.addParseAction(lambda tokens: print("x)", tokens))  # Print action for debugging

y = pp.Word("abc")
y.addParseAction(lambda tokens: print("y)", tokens))

text = pp.OneOrMore(x ^ y)
text.parseString("bb cc ab bc cb bc abc bca bbb acc cbc ccc abc")

但由于某种原因,这很快就停止了 1 个单词,这是输出:

y) ['bb']
y) ['cc']
x) ['ab', 'bc', 'bc']
y) ['cb']
y) ['abc']
y) ['bca']
y) ['bbb']
x) ['acc', 'cbc']
y) ['ccc']
y) ['abc']

此外,如果 abc 停止标记是不同字符串的列表,所有这些字符串都将用作停止标记,我该如何解析它?

所以类似:

stopStrings = ["abc", "bca"]
x = pp.OneOrMore(pp.Word("abc") + ~pp.OneOf(stopStrings))
...

希望这能够清楚地说明并感谢您的帮助!

最佳答案

这可能接近您想要的。我不明白你的第三个条件。

  • token 的定义坚持它不是stop_tokens之一,而是一个Word 由集合 {a,b,c} 中的任意字母组成。
  • 识别 token 后,setParseAction 会发送一个请求,要求在其第一个字符为“a”时显示该 token 。
  • 整个解析器只是任意数量的token,后跟任意数量的stop_token。每个 stop_token 在此上下文中都被抑制。同时,如果识别出 stop_token,则会发出一条消息,表明已看到该 token 。

代码:

import pyparsing as pp

def report_a(s):
    try:
        if s[0][0]=='a':
            print (s[0], "begins with 'a'")
    except:
        pass

def report(s):
    print ('stop token encountered')

stop_tokens = pp.Or([pp.Literal('abc'), pp.Literal('bca')])
token = pp.NotAny(stop_tokens) + pp.Word('abc').setParseAction(lambda s: report_a(s))
parser = pp.ZeroOrMore(token) + pp.ZeroOrMore(stop_tokens).setParseAction(lambda s: report(s)).suppress()

text = 'bb cc ab bc cb bc abc bca bbb acc cbc ccc abc'

print (parser.parseString(text))

结果:

ab begins with 'a'
stop token encountered
['bb', 'cc', 'ab', 'bc', 'cb', 'bc']

关于python - 使用停止标记解析字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48647173/

相关文章:

python - 从脚本运行 Scrapy,需要帮助理解它

javascript - 为什么 Transcrypt 编译在带有 : os. system ('python -m transcrypt -b -m -n <somePythonFile>.py' ) 行的 Python 脚本中不起作用?

python - 为什么pyparsing的可选总是返回一个列表

python - 如何解析非唯一的位置模式?

python - 在pyparsing中,如何分配一个 "no match"键值?

python - 有纯 Python Lucene 吗?

python - 如何修复空的 tensorflow 安装?

Python:检测输入仅适用于 1 个字符长的字符串

python - pyparsing 访问 ParseResults 时遇到问题

python & pyparsing newb : how to open a file