Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用pyparsing解析多个lins中文文本?_Python_Text_Pattern Matching_Extract_Pyparsing - Fatal编程技术网

Python 如何使用pyparsing解析多个lins中文文本?

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从中文数据集中提取一些字符串块。但是
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)