电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

python中使用正則表達(dá)式將所有符合條件的字段全部提取出來

瀏覽:4日期:2022-07-13 11:31:29

問題如標(biāo)題,使用正則表達(dá)式匹配字段目前無非就三種,分別是:

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

簡單介紹一下,re.match()與re.search()非常類似,主要區(qū)別就是前者是從目標(biāo)字符串的開頭匹配,而后者則要沒有這個(gè)要求。而re.findall()則是可以返回匹配的所有結(jié)果。但是有時(shí)候re.findall()返回的結(jié)果和前面兩個(gè)并不一樣,我們來看下面一個(gè)例子:對于句子:

起病以來,患者無腰背痛、頸痛,無咽痛、口腔潰瘍,無光過敏、脫發(fā),無口干、眼干,無肢端發(fā)作性青紫,無肢體乏力,無浮腫、泡沫尿,精神、食欲、睡眠欠佳,近1月大便干結(jié),5-6天1次,無腹痛、黑便、便血,小便1-2小時(shí)1次,無尿痛、血尿。體重未見明顯變化。

我想使用正則去匹配所有包含小便和尿相關(guān)的子句,目的就是將“無浮腫、泡沫尿”和“小便1-2小時(shí)1次,無尿痛、血尿。”識別出來并且將這些子句返回。本來我想使用re.findall()去匹配:

import relines = [ '起病以來,患者無腰背痛、頸痛,無咽痛、口腔潰瘍,無光過敏、脫發(fā),無口干、眼干,無肢端發(fā)作性青紫,無肢體乏力,無浮腫、泡沫尿,精神、食欲、睡眠欠佳,近1月大便干結(jié),5-6天1次,無腹痛、黑便、便血,小便1-2小時(shí)1次,無尿痛、血尿。體重未見明顯變化。', ]for line in lines: pattern = '[,;.,;。]+[^,;.,;。]*((小便)|尿)+[^,;.,;。]*[,;.,;。]+' str = re.findall(pattern,line) print(str)

結(jié)果為:

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

這里說明一下我使用的模式的意義,因?yàn)槲沂且ヅ渥泳洌砸粋€(gè)子句的前后必然會有相應(yīng)的符號,所以pattern前面和后面均添加了“[,;.,;。]+”;“+”表示至少匹配一個(gè)。而后面的“[,;.,;。]*”表示匹配0個(gè)或多個(gè)除標(biāo)點(diǎn)符號“,;.,;。”的任意字符,這里分別添加了中英文的逗號、分號和句號,“*”表示匹配0個(gè)或1個(gè)及以上。需要說明的是,這里我之所以使用“[,;.,;。]”,是因?yàn)槲谋局锌赡馨芏嗥渌姆枺裆侠谐霈F(xiàn)的“-”;所以想要使用漢字、數(shù)字、特定符號來匹配的話可能會存在遺漏,而我的目的是只想要得到匹配的子句,所以使用“[^,;.,;。]”會更通用一些。接下來就是“((小便)|尿)”意思是匹配含有“小便”或者含有“尿”的子串。但是使用re.findall()所得到的結(jié)果并不是我想要的,于是我稍微換了一下匹配規(guī)則,將“((小便)|尿)+”換成了“[(小便)|尿]+”;為了驗(yàn)證匹配的適用性,我又添加了兩個(gè)樣本。總體如下:

import relines = [ '起病以來,患者無腰背痛、頸痛,無咽痛、口腔潰瘍,無光過敏、脫發(fā),無口干、眼干,無肢端發(fā)作性青紫,無肢體乏力,無浮腫、泡沫尿,精神、食欲、睡眠欠佳,近1月大便干結(jié),5-6天1次,無腹痛、黑便、便血,小便1-2小時(shí)1次,無尿痛、血尿。體重未見明顯變化。', '起病以來,睡眠、胃納正常,小便正常,近4~5年來每天解大便3~4次,多為黃褐色成形軟便,偶有解爛便,有排便不盡感,便血、解黑便,無消瘦。', '身材矮小,體重較同齡人輕。']for line in lines: pattern = '[,;.,;。]+[^,;.,;。]*[(小便)尿]+[^,;.,;。]*[,;.,;。]+' str = re.findall(pattern,line) print(str)

結(jié)果為:

[’,無浮腫、泡沫尿,’, ’,近1月大便干結(jié),’, ’,無腹痛、黑便、便血,’, ’,無尿痛、血尿。’][’,小便正常,’, ’,多為黃褐色成形軟便,’, ’,有排便不盡感,’][]

倒是匹配出了子句,一則是“小便1-2小時(shí)1次,無尿痛、血尿”中的“小便1-2小時(shí)1次”沒有匹配出來,二則是竟然連大便相關(guān)的“近1月大便干結(jié)”和“無腹痛、黑便、便血”都匹配出來了,看來“[(小便)尿]”的意思并不是匹配含有“小便”或者“尿”的子串;那“[(小便)尿]”的意思是不是匹配含有“小”、“便”、“尿”任意一個(gè)的子串呢?但是根據(jù)第三個(gè)含有“小”但是不含“便”與“尿”的樣本可以看出,上述的想法依然不對。再加上re.findall()沒有匹配到的子串在原始文本中的開始和結(jié)束位置,所以我想要得到“小便1-2小時(shí)1次,無尿痛、血尿。”這種兩個(gè)子句連在一起的情況也很難得到。于是我轉(zhuǎn)而使用另一個(gè)很常用的re.search()方法。

import relines = [ '起病以來,患者無腰背痛、頸痛,無咽痛、口腔潰瘍,無光過敏、脫發(fā),無口干、眼干,無肢端發(fā)作性青紫,無肢體乏力,無浮腫、泡沫尿,精神、食欲、睡眠欠佳,近1月大便干結(jié),5-6天1次,無腹痛、黑便、便血,小便1-2小時(shí)1次,無尿痛、血尿。體重未見明顯變化。',]for line in lines: pattern = '[,;.,;。]+[^,;.,;。]*((小便)|尿)+[^,;.,;。]*[,;.,;。]+' str = re.search(pattern, line) print(str.group())

結(jié)果為:

,無浮腫、泡沫尿,

可見,re.search()只匹配遇到的第一個(gè)滿足條件的子串。而如果將pattern中的“((小便)|尿)”修改為“[(小便)|尿]”(或者“[(小便)尿]”,意思是完全一樣的,也試過)得到的結(jié)果為:

,無浮腫、泡沫尿,

可見修改前后并沒有任何變化,但是如果我將原始文本中的“無浮腫、泡沫尿”中的“尿”刪除,則修改前的結(jié)果為:

,小便1-2小時(shí)1次,

修改后的結(jié)果為:

,近1月大便干結(jié),

也就是說對于

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

無論是re.findall()還是re.search(),都能匹配到大便相關(guān)的子串;而對于:

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

re.findall()和re.search()匹配的子串就有所區(qū)別了,前置匹配的結(jié)果是含有元組的列表:[(‘尿’, ‘’), (‘小便’, ‘小便’)];而后者匹配到了我想要的子串:,無浮腫、泡沫尿,后來問了同事以及進(jìn)一步了解了正則的運(yùn)行機(jī)制后,發(fā)現(xiàn)小括號()除了提取匹配的字符串,還有一個(gè)作用是用來捕獲分組的,也就是說小括號中的內(nèi)容匹配后會被存儲起來,在調(diào)用的時(shí)候便會返回相應(yīng)的值。而使用re.findall()時(shí)會將存儲分組的值全部返回。再舉個(gè)例子會更加明白些,將上述pattern中的“((小便)|尿)”改為“((小便)|(尿))”,如:

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

使用re.findall()輸出的結(jié)果為:

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

由上可知,“((小便)|(尿))”使用了三個(gè)“()”,于是便產(chǎn)生了三個(gè)分組,在最外圍的第一個(gè)分組用于捕獲“小便”或“尿”,原文中“小便”和“尿”都能匹配到,所以第一個(gè)位置兩者都有;第二個(gè)分組是用來捕獲“(小便)”的,所以第二個(gè)分組只存儲“小便”;同理第三個(gè)分組用來捕獲“(尿)”的,所以結(jié)果只存儲了“尿”。而我使用re.search()來輸出分組結(jié)果:

for line in lines: pattern = '[,;.,;。]+[^,;.,;。]*((小便)|(尿))+[^,;.,;。]*[,;.,;。]+' str = re.search(pattern, line) print(str.group(0)) print(str.group(1)) print(str.group(2)) print(str.group(3))

結(jié)果為:

,無浮腫、泡沫尿,尿None尿

group(1)、group(2)、group(3)分別與(‘尿’, ‘’, ‘尿’)中對應(yīng)的分組結(jié)果相同。但是這里的group(0)(或者說group(),兩個(gè)意思完全一樣)卻不是“(‘尿’, ‘’, ‘尿’)”;這里作者水平有限,不是很清楚原因,也就是說,當(dāng)調(diào)用group(0)的時(shí)候,pattern中的()的意義并不再是捕獲分組了,而是回到了原始的提取匹配字符串的意思上來了。為了解決

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

會匹配到不想要的含有“大便”字符串的問題,通過使用非捕獲分組(?:)便可以達(dá)到目的。

pattern = '[,;.,;。]?[^,;.,;。]*(?:小便|尿)[^,;.,;。]*[,;.,;。]'

此時(shí)便是匹配“小便”或者“尿”了;結(jié)果為:

[’,無浮腫、泡沫尿,’, ’,小便1-2小時(shí)1次,’, ’無尿痛、血尿。’]

注意上述結(jié)果,由于“,小便1-2小時(shí)1次,”和“無尿痛、血尿。”是緊接著的,而逗號已經(jīng)被分配給了前者,所以后者便沒有了逗號,這看起了有點(diǎn)像字符串的切片,被切走了就沒了,所以這里在pattern中的第一個(gè)“[,;.,;。]”后面將“+”換成了“?”()意思的前面的字符出現(xiàn)0次或1次;當(dāng)然更進(jìn)一步可以優(yōu)化為:

pattern = '[,;.,;。]?[^,;.,;。]*(?:小便|尿).*?[,;.,;。]'

可以看到,將pattern中第二個(gè)“[^,;.,;。]”變?yōu)椤??”上述雖然將所有子句全部匹配并輸出了,但是相鄰的兩個(gè)子句還是分開輸出的,仍舊沒有達(dá)到我們想要的預(yù)期。于是對上述代碼進(jìn)行了改進(jìn):

for line in lines: #pattern = '[,;.,;。]+[^,;.,;。]*[(’小便’)尿]+[^,;.,;。]*[,;.,;。]+' pattern = '[,;.,;。]?[^,;.,;。]*?(?:小便|尿).*?[,;.,;。]' #pattern = '[,;.,;。]?[^,;.,;。]*(?:小便|尿)[^,;.,;。]*[,;.,;。]' str = re.findall(pattern,line) ls = [’,’,’;’,’.’,’,’,’;’,’。’] for idx, text in enumerate(str): if text[0] not in ls: str[idx-1] += text str.remove(text) print(str)

結(jié)果為:

[’,無浮腫、泡沫尿,’, ’,小便1-2小時(shí)1次,無尿痛、血尿。’]

而如果使用re.search(),也是可以達(dá)到預(yù)期的,代碼如下:

for line in lines: result = [] num = -1 while line: #pattern = re.compile(r'[,;.,;。]+[^,;.,;。]*((小便)|尿)+[^,;.,;。]*[,;.,;。]+') #str = pattern.search(line) pattern = r'[,;.,;。]+[^,;.,;。]*((小便)|尿)+[^,;.,;。]*[,;.,;。]+' str = re.search(pattern,line) if str == None: break tmp = str.group() if str.start() == 0: result[-1] += tmp[1:] else: result.append(tmp[1:]) #print(tmp) num = str.end() - 1 #print(num) line = line[num:] print(result)

結(jié)果為:

[’無浮腫、泡沫尿,’, ’小便1-2小時(shí)1次,無尿痛、血尿。’]

到此這篇關(guān)于python中使用正則表達(dá)式將所有符合條件的字段全部提取出來的文章就介紹到這了,更多相關(guān)python 正則表達(dá)式提取字段內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | TwistDx恒温扩增-RAA等温-Jackson抗体-默瑞(上海)生物科技有限公司 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 集装箱箱号识别_自重载重图像识别_铁路车号自动识别_OCR图像识别 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | 全国冰箱|空调|洗衣机|热水器|燃气灶维修服务平台-百修家电 | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 钛合金标准件-钛合金螺丝-钛管件-钛合金棒-钛合金板-钛合金锻件-宝鸡远航钛业有限公司 | 河南新乡德诚生产厂家主营震动筛,振动筛设备,筛机,塑料震动筛选机 | b2b网站大全,b2b网站排名,找b2b网站就上地球网 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 卧涛科技有限公司科技项目申报公司|高新技术企业申报|专利申请 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 杭州用友|用友软件|用友财务软件|用友ERP系统--杭州协友软件官网 | 代写标书-专业代做标书-商业计划书代写「深圳卓越创兴公司」 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 黑龙江「京科脑康」医院-哈尔滨失眠医院_哈尔滨治疗抑郁症医院_哈尔滨精神心理医院 | 色谱柱-淋洗液罐-巴罗克试剂槽-巴氏吸管-5ml样品瓶-SBS液氮冻存管-上海希言科学仪器有限公司 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 磷酸肌酸二钠盐,肌酐磷酰氯-沾化欣瑞康生物科技 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 九州网址_专注于提供网址大全分享推广中文网站导航服务 | 长沙网站建设制作「网站优化推广」-网页设计公司-速马科技官网 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 干式磁选机_湿式磁选机_粉体除铁器-潍坊国铭矿山设备有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 展厅设计-展馆设计-专业企业展厅展馆设计公司-昆明华文创意 | 泰国试管婴儿_泰国第三代试管婴儿_泰国试管婴儿费用/多少钱_孕泰来 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | 温州食堂承包 - 温州市尚膳餐饮管理有限公司 | 中国品牌排名投票_十大品牌榜单_中国著名品牌【中国品牌榜】 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | 泰国专线_泰国物流专线_广州到泰国物流公司-泰廊曼国际 | 华东师范大学在职研究生招生网_在职研究生招生联展网 |