加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营 > 正文

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

发布时间:2020-10-25 15:37:02 所属栏目:运营 来源:网络整理
导读:这篇文章首要先容了python中行使正则表达式将全部切合前提的字段所有提取出来,本文给各人先容的很是具体,对各人的进修或事变具有必然的参考小心代价,必要的朋
副问题[/!--empirenews.page--]

  短视频,自媒体,达人种草一站处事

这篇文章首要先容了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()去匹配:

import re
lines = [
 "起病以来,患者无腰背痛、颈痛,无咽痛、口腔溃疡,无光过敏、脱发,无口干、眼干,无肢端爆发性青紫,无肢体乏力,无浮肿、泡沫尿,精力、食欲、就寝欠佳,近1月大便干结,5-6天1次,无腹痛、黑便、便血,小便1-2小时1次,无尿痛、血尿。体重未见明明变革。",
 ]
for line in lines:
 pattern = "[,;.,;。]+[^,;.,;。]*((小便)|尿)+[^,;.,;。]*[,;.,;。]+"
 str = re.findall(pattern,line)
 print(str)

功效为:

[('尿', ''), ('小便', '小便')]

这里声名一下我行使的模式的意义,由于我是要匹配子句,以是一个子句的前后肯定会有响应的标记,以是pattern前面和后头均添加了“[,;.,;。]+”;“+”暗示至少匹配一个。尔后头的“[,;.,;。]*”暗示匹配0个或多个除标点标记“,;.,;。”的恣意字符,这里别离添加了中英文的逗号、分号和句号,“*”暗示匹配0个或1个及以上。必要声名的是,这里我之以是行使“[,;.,;。]”,是由于文本中也许包括许多其他的标记,像上例中呈现的“-”;以是想要行使汉字、数字、特定标记来匹配的话也许会存在漏掉,而我的目标是只想要获得匹配的子句,以是行使“[^,;.,;。]”会更通用一些。接下来就是“((小便)|尿)”意思是匹配含有“小便”可能含有“尿”的子串。

可是行使re.findall()所获得的功效并不是我想要的,于是我轻微换了一下匹配法则,将“((小便)|尿)+”换成了“[(小便)|尿]+”;为了验证匹配的合用性,我又添加了两个样本。总体如下:

import re
lines = [
 "起病以来,患者无腰背痛、颈痛,无咽痛、口腔溃疡,无光过敏、脱发,无口干、眼干,无肢端爆发性青紫,无肢体乏力,无浮肿、泡沫尿,精力、食欲、就寝欠佳,近1月大便干结,5-6天1次,无腹痛、黑便、便血,小便1-2小时1次,无尿痛、血尿。体重未见明明变革。",
 "起病以来,就寝、胃纳正常,小便正常,近4~5年来天天解大便3~4次,多为黄褐色成形软便,偶有解烂便,有排便不尽感,便血、解黑便,无瘦弱。",
 "身段矮小,体重较同龄人轻。"
]
for line in lines:
 pattern = "[,;.,;。]+[^,;.,;。]*[(小便)尿]+[^,;.,;。]*[,;.,;。]+"
 str = re.findall(pattern,line)
 print(str)

功效为:

[',无浮肿、泡沫尿,', ',近1月大便干结,', ',无腹痛、黑便、便血,', ',无尿痛、血尿。']

[',小便正常,', ',多为黄褐色成形软便,', ',有排便不尽感,']

[]

倒是匹配出了子句,一则是“小便1-2小时1次,无尿痛、血尿”中的“小便1-2小时1次”没有匹配出来,二则是竟然连大便相干的“近1月大便干结”和“无腹痛、黑便、便血”都匹配出来了,看来“[(小便)尿]”的意思并不是匹配含有“小便”可能“尿”的子串;那“[(小便)尿]”的意思是不是匹配含有“小”、“便”、“尿”恣意一个的子串呢?可是按照第三个含有“小”可是不含“便”与“尿”的样本可以看出,上述的设法依然差池。

再加上re.findall()没有匹配到的子串在原始文本中的开始和竣事位置,以是我想要获得“小便1-2小时1次,无尿痛、血尿。”这种两个子句连在一路的环境也很难获得。

于是我转而行使另一个很常用的re.search()要领。

import re
lines = [
 "起病以来,患者无腰背痛、颈痛,无咽痛、口腔溃疡,无光过敏、脱发,无口干、眼干,无肢端爆发性青紫,无肢体乏力,无浮肿、泡沫尿,精力、食欲、就寝欠佳,近1月大便干结,5-6天1次,无腹痛、黑便、便血,小便1-2小时1次,无尿痛、血尿。体重未见明明变革。",
]
for line in lines:
 pattern = "[,;.,;。]+[^,;.,;。]*((小便)|尿)+[^,;.,;。]*[,;.,;。]+"
 str = re.search(pattern, line)
 print(str.group())

功效为:

,无浮肿、泡沫尿,

可见,re.search()只匹配碰着的第一个满意前提的子串。

而假如将pattern中的“((小便)|尿)”修改为“[(小便)|尿]”(可能“[(小便)尿]”,意思是完全一样的,也试过)

获得的功效为:

,无浮肿、泡沫尿,

可见修改前后并没有任何变革,可是假如我将原始文本中的“无浮肿、泡沫尿”中的“尿”删除,则修改前的功效为:

,小便1-2小时1次,

修改后的功效为:

,近1月大便干结,

也就是说对付

pattern = "[,;.,;。]+[^,;.,;。]*[(小便)尿]+[^,;.,;。]*[,;.,;。]+"

无论是re.findall()照旧re.search(),都能匹配到大便相干的子串;

而对付:

pattern = "[,;.,;。]+[^,;.,;。]*((小便)|尿)+[^,;.,;。]*[,;.,;。]+"

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读