【问题标题】:String between two markers using PyParsing使用 PyParsing 的两个标记之间的字符串
【发布时间】:2020-04-27 03:40:25
【问题描述】:

我需要使用 PyParsing 获取两个标记之间的字符串。

从字符串s = 'qwertyAAA1234ZZZazerty' 我想检索AAAZZZ 之间的字符串1234

到目前为止,我可以使用searchString() 来做到这一点。用parseString()可以得到同样的结果吗?

使用 PyParsing 的 searchString()

import pyparsing as pp

word = pp.Word(pp.alphanums)

s = 'qwertyAAA1234ZZZazerty'
rule = pp.nestedExpr('AAA', 'ZZZ')
for match in rule.searchString(s):
    print(match)

产生:

[['1234']]

使用 PyParsing 的 parseString()

import pyparsing as pp

word = pp.Word(pp.alphanums)

s = 'gfgfdAAA1234ZZZuijjk'
rule = pp.nestedExpr('AAA', 'ZZZ')
print(rule.parseString(s))

产生:

Traceback (most recent call last):
  File "main.py", line 14, in <module>
    print(rule.parseString(s))
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 1939, in parseString
    raise exc
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 1929, in parseString
    loc, tokens = self._parse(instring, 0)
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 1669, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 4430, in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 1669, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 4430, in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 1669, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 4020, in parseImpl
    loc, resultlist = self.exprs[0]._parse(instring, loc, doActions, callPreParse=False)
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 1673, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 4430, in parseImpl
    return self.expr._parse(instring, loc, doActions, callPreParse=False)
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 1673, in _parseNoCache
    loc, tokens = self.parseImpl(instring, preloc, doActions)
  File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/pyparsing.py", line 2871, in parseImpl
    raise ParseException(instring, loc, self.errmsg, self)
pyparsing.ParseException: Expected "AAA", found 'g'  (at char 0), (line:1, col:1)

【问题讨论】:

    标签: python python-3.x string text-parsing pyparsing


    【解决方案1】:

    试试 SkipTo,或者它的快捷方式...

    print((... + rule).parseString(s).dump())
    

    给予:

    ['gfgfd', ['1234']]
    - _skipped: ['gfgfd']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多