python中使用正则表达式将所有符合条件的字段全部提取出来

  

问题如标题,使用正则表达式匹配字段目前无非就三种,分别是:

        re.match ()   re.search ()   re.findall ()      

简单介绍一下,re.match()与re.search()非常类似,主要区别就是前者是从目标字符串的开头匹配,而后者则要没有这个要求。而re.findall()则是可以返回匹配的所有结果。但是有时候re.findall()返回的结果和前面两个并不一样,我们来看下面一个例子:
  对于句子:

  
  

起病以来,患者无腰背痛,颈痛,无咽痛,口腔溃疡,无光过敏,脱发,无口干、眼干,无肢端发作性青紫,无肢体乏力,无浮肿,泡沫尿,精神,食欲,睡眠欠佳,近1月大便干结,5 - 6天1次,无腹痛,黑便,便血,小便1 - 2小时1次,无尿痛,血尿。体重未见明显变化。

     

我想使用正则去匹配所有包含小便和尿相关的子句,目的就是将“无浮肿,泡沫尿”和“小便1 - 2小时1次,无尿痛,血尿。”识别出来并且将这些子句返回。
  本来我想使用re.findall()去匹配:

        进口再保险   行=[   “起病以来,患者无腰背痛,颈痛,无咽痛,口腔溃疡,无光过敏,脱发,无口干、眼干,无肢端发作性青紫,无肢体乏力,无浮肿,泡沫尿,精神,食欲,睡眠欠佳,近1月大便干结,5 - 6天1次,无腹痛,黑便,便血,小便1 - 2小时1次,无尿痛,血尿。体重未见明显变化。”,   ]   线的线:   模式="[,,,。]+[^;;。]*((小便)|尿)+ [^;;。]* [,,,。]+”   str=re.findall(模式、线)   打印(str)      

结果为:

  
  

[(“尿”,“),(“小便”,“小”便)]

     

这里说明一下我使用的模式的意义,因为我是要匹配子句,所以一个子句的前后必然会有相应的符号,所以模式前面和后面均添加了”(,,,,)+”、“+”表示至少匹配一个。而后面的”,,,。*”表示匹配0个或多个除标点符号”,,,,。”的任意字符,这里分别添加了中英文的逗号,分号和句号,“*”表示匹配0个或1个及以上。需要说明的是,这里我之所以使用”(,,,。)”,是因为文本中可能包含很多其他的符号,像上例中出现的“-”,所以想要使用汉字,数字,特定符号来匹配的话可能会存在遗漏,而我的目的是只想要得到匹配的子句,所以使用”(^;;。)”会更通用一些。接下来就是“((小便)|尿)”意思是匹配含有“小”便或者含有“尿”的子串。
  但是使用re.findall()所得到的结果并不是我想要的,于是我稍微换了一下匹配规则,将“((小便)|尿)+”换成了”[(小便)|尿)+”;为了验证匹配的适用性,我又添加了两个样本。总体如下:

        进口再保险   行=[   “起病以来,患者无腰背痛,颈痛,无咽痛,口腔溃疡,无光过敏,脱发,无口干、眼干,无肢端发作性青紫,无肢体乏力,无浮肿,泡沫尿,精神,食欲,睡眠欠佳,近1月大便干结,5 - 6天1次,无腹痛,黑便,便血,小便1 - 2小时1次,无尿痛,血尿。体重未见明显变化。”,   “起病以来,睡眠,胃纳正常,小便正常,近4 ~ 5年来每天解大便3 ~ 4次,多为黄褐色成形软便,偶有解烂便,有排便不尽感,便血,解黑便,无消瘦。”,   “身材矮小,体重较同龄人轻。”   ]   线的线:   模式="[,,,。]+[^;;。]*[(小)便尿]+ [^;;。]* [,,,。]+”   str=re.findall(模式、线)   打印(str)      

结果为:

  
  

[',无浮肿,泡沫尿,”,“近1月大便干结,“,”,无腹痛,黑便,便血,“,”,无尿痛,血尿。)
  [',小便正常的,”,多为黄褐色成形软便,”,”,有排便不尽感,’]
  []

     

倒是匹配出了子句,一则是“小便1 - 2小时1次,无尿痛,血尿”中的“小便1 - 2小时1次“没有匹配出来,二则是竟然连大便相关的“近1月大便干结”和“无腹痛,黑便,便血”都匹配出来了,看来”[(小)便尿)”的意思并不是匹配含有“小”便或者“尿”的子串,那“[(小)便尿)”的意思是不是匹配含有“小”、“便”、“尿”任意一个的子串呢?但是根据第三个含有“小”但是不含“便”与“尿”的样本可以看的出,上述的想法依然不对。
  再加上re.findall()没有匹配到的子串在原始文本中的开始和结束位置,所以我想要得到“小便1 - 2小时1次,无尿痛,血尿”。这种两个子句连在一起的情况也很难得到。
  于是我转而使用另一个很常用的re.search()方法。

        进口再保险   行=[   “起病以来,患者无腰背痛,颈痛,无咽痛,口腔溃疡,无光过敏,脱发,无口干、眼干,无肢端发作性青紫,无肢体乏力,无浮肿,泡沫尿,精神,食欲,睡眠欠佳,近1月大便干结,5 - 6天1次,无腹痛,黑便,便血,小便1 - 2小时1次,无尿痛,血尿。体重未见明显变化。”,   ]   线的线:   模式="[,,,。]+[^;;。]*((小便)|尿)+ [^;;。]* [,,,。]+”   str=re.search(模式、线)   print (str.group ())

python中使用正则表达式将所有符合条件的字段全部提取出来