Python 如何使用pyparsing解析多个lins中文文本?
我想使用pyparsing从中文数据集中提取一些字符串块。但是Python 如何使用pyparsing解析多个lins中文文本?,python,text,pattern-matching,extract,pyparsing,Python,Text,Pattern Matching,Extract,Pyparsing,我想使用pyparsing从中文数据集中提取一些字符串块。但是pyparsing.Word用于英语,但在中文文本中效果很好,我尝试使用Regex代替 由于stackoverflow无法发布大型中文文本,我必须使用pastebin, 以下是示例数据,以及我要提取的内容: 如您所见,我想提取1]、。。。2、 ..(可以是其他数字序列,如(1)(2)或(一) (二))之间的中文数字一、 二、 ... 我的代码: 我的代码有错误: ParseException回溯(最近一次调用) 在() ---->1
pyparsing.Word
用于英语,但在中文文本中效果很好,我尝试使用Regex代替
由于stackoverflow无法发布大型中文文本,我必须使用pastebin,
以下是示例数据,以及我要提取的内容:
如您所见,我想提取1]、。。。2、 ..
(可以是其他数字序列,如(1)(2)
或(一) (二)代码>)之间的中文数字一、 二、 ...代码>
我的代码:
我的代码有错误:
ParseException回溯(最近一次调用)
在()
---->1 qaStart.parseString(t1)
/parseString中的usr/local/lib/python3.5/dist-packages/pyparsing.py(self、instring、parseAll)
1615其他:
1616#从这里捕获并重新引发异常,清除内部堆栈跟踪
->1617年
1618其他:
1619归还代币
/parseString中的usr/local/lib/python3.5/dist-packages/pyparsing.py(self、instring、parseAll)
1605 instring=instring.expandtabs()
1606尝试:
->1607 loc,令牌=self.\u解析(instring,0)
1608如果全部解析:
1609 loc=自行准备(安装,loc)
/usr/local/lib/python3.5/dist-packages/pyparsinocache中的pyparsing.py(self、instring、loc、doActions、callPreParse)
1377如果self.mayindexer或loc>=len(安装):
1378试试:
->1379 loc,令牌=self.parseImpl(指令、预指令、动作)
1380除索引器外:
1381 raise ParseException(instring,len(instring),self.errmsg,self)
/parseImpl中的usr/local/lib/python3.5/dist-packages/pyparsing.py(self、instring、loc、doActions)
3374语法异常(instring,len(instring),self.errmsg,self)
3375其他:
->3376 loc,exprtokens=e.(安装,loc,doActions)
3377如果exprtokens或exprtokens.haskeys():
3378结果列表+=exprtokens
/usr/local/lib/python3.5/dist-packages/pyparsinocache中的pyparsing.py(self、instring、loc、doActions、callPreParse)
1381 raise ParseException(instring,len(instring),self.errmsg,self)
1382其他:
->1383 loc,令牌=self.parseImpl(指令、预指令、动作)
1384
1385代币=self.postParse(instring、loc、代币)
/parseImpl中的usr/local/lib/python3.5/dist-packages/pyparsing.py(self、instring、loc、doActions)
2773结果=自我重新匹配(安装,位置)
2774如果没有结果:
->2775上升解析异常(指令、位置、self.errmsg、self)
2776
2777 loc=结果结束()
ParseException:应为Re:('投标|投标人|投标单位|供应商') (在字符2处),(第2行,第2列)
看起来我无法这样定义正则表达式规则,但正确的方法是什么?您的解析器跨越多行,但一次只能解析一行。请尝试:qaBlock.parseString('\n'.join([t1,t2,t3,t4])
您的解析器跨越多行,但一次只能解析一行。请尝试:qaBlock.parseString('\n'.join)([t1、t2、t3、t4]))
from pyparsing import *
CN_TEXT = Regex('[\u4E00-\u9FA5A]*')
CN_NUM = Regex('[一二三四五六七八九十]')
bider = Regex('投标|投标人|投标单位|供应商')
qa = Regex('资质|资格|条件')
# start pattern is
# t1 三、 供应商资质要求:
# t2 三、投标人资格要求
# t3 一、合格的投标人必须具备以下条件:
# t4 五、供应商应具备的条件及资格:
qaStart = LineStart() + CN_NUM + CN_TEXT + bider + CN_TEXT + qa + CN_TEXT + Optional(':') + LineEnd()
# lines pattern
qaLineEmpty = Suppress(LineStart() + LineEnd())
qaLine = LineStart() + restOfLine() + LineEnd()
qaLines = OneOrMore(Optional(qaLine, qaLineEmpty )) # this is what I need
# another block start, it is this block end
qaEnd = LineStart() + CN_NUM
qaBlock = qaStart + qaLines + qaEnd
for i in [t1, t2, t3, t4]:
print(qaBlock.parseString(i))
ParseException Traceback (most recent call last)
<ipython-input-19-61242b74d440> in <module>()
----> 1 qaStart.parseString(t1)
/usr/local/lib/python3.5/dist-packages/pyparsing.py in parseString(self, instring, parseAll)
1615 else:
1616 # catch and re-raise exception from here, clears out pyparsing internal stack trace
-> 1617 raise exc
1618 else:
1619 return tokens
/usr/local/lib/python3.5/dist-packages/pyparsing.py in parseString(self, instring, parseAll)
1605 instring = instring.expandtabs()
1606 try:
-> 1607 loc, tokens = self._parse( instring, 0 )
1608 if parseAll:
1609 loc = self.preParse( instring, loc )
/usr/local/lib/python3.5/dist-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
1377 if self.mayIndexError or loc >= len(instring):
1378 try:
-> 1379 loc,tokens = self.parseImpl( instring, preloc, doActions )
1380 except IndexError:
1381 raise ParseException( instring, len(instring), self.errmsg, self )
/usr/local/lib/python3.5/dist-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
3374 raise ParseSyntaxException(instring, len(instring), self.errmsg, self)
3375 else:
-> 3376 loc, exprtokens = e._parse( instring, loc, doActions )
3377 if exprtokens or exprtokens.haskeys():
3378 resultlist += exprtokens
/usr/local/lib/python3.5/dist-packages/pyparsing.py in _parseNoCache(self, instring, loc, doActions, callPreParse)
1381 raise ParseException( instring, len(instring), self.errmsg, self )
1382 else:
-> 1383 loc,tokens = self.parseImpl( instring, preloc, doActions )
1384
1385 tokens = self.postParse( instring, loc, tokens )
/usr/local/lib/python3.5/dist-packages/pyparsing.py in parseImpl(self, instring, loc, doActions)
2773 result = self.re.match(instring,loc)
2774 if not result:
-> 2775 raise ParseException(instring, loc, self.errmsg, self)
2776
2777 loc = result.end()
ParseException: Expected Re:('投标|投标人|投标单位|供应商') (at char 2), (line:2, col:2)