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

您的位置:首頁技術文章
文章詳情頁

python re.match()用法相關示例

瀏覽:4日期:2022-06-29 08:25:32

學習python爬蟲時遇到了一個問題,書上有示例如下:

import reline=’Cats are smarter than dogs’matchObj=re.match(r’(.*)are(.*?).*’,line)if matchObj: print(’matchObj.group():’,matchObj.group()) print(’matchObj.group(1):’, matchObj.group(1)) print(’matchObj.group(2):’, matchObj.group(2))else: print(’No match!n’)

書上的期望輸出是:

matchObj.group(): Cats are smarter than dogsmatchObj.group(1): Cats matchObj.group(2):smarter

但是我在電腦上跑了一遍得到的輸出卻是:

matchObj.group(): Cats are smarter than dogsmatchObj.group(1): Cats matchObj.group(2):

于是開始想辦法徹底搞清楚這個差別的原因所在。

首先要讀懂這幾行代碼,而這一行代碼的關鍵在于這一句:

matchObj=re.match(r’(.*)are(.*?).*’,line)

匹配的正則表達式是

(.*)are(.*?).*前面的r表示的是匹配的字符不進行轉義,而要匹配的字符串是line,也就是Cats are smarter than dogs后面使用group(num),個人理解是,按照正則表達式中的括號數(shù)可以捕獲得到對應數(shù)量的捕獲組,而調用group(num)就可以得到對應捕獲組的內(nèi)容,其中group(0)表示的是匹配的整個表達式的字符串,在本例中就是‘Cats are smarter than dogs’。參照網(wǎng)上可以搜到的符號的作用:.匹配除換行符以外的任意字符*重復之前的字符零次或更多次?重復之前的字符零次或一次那么第一個括號的內(nèi)容,應當就是匹配要匹配的字符串中are之前的所有字符(除換行符),而第二個括號的內(nèi)容應當是匹配are之后的內(nèi)容,但具體想指代什么卻顯得有些不明確。不明確的點就在于*和?這兩個符號的連用,根據(jù)優(yōu)先級這兩個符號是同一優(yōu)先級的,那么應當按照順序生效,那么如此翻譯的話,這一語句匹配的就是長度為0到無限大的任意字符串,為了探清此時程序判斷的具體內(nèi)容,我們給匹配字符串末尾的.*也加上括號以提取其內(nèi)容,而后在輸出部分加上對應語句:

import reline=’Cats are smarter than dogs’matchObj=re.match(r’(.*)are(.*?)(.*)’,line)if matchObj: print('matchObj.group():',matchObj.group()) print('matchObj.group(1):', matchObj.group(1)) print('matchObj.group(2):', matchObj.group(2)) print('matchObj.group(3):', matchObj.group(3))else: print(’No match!n’)

得到的結果是:

matchObj.group(): Cats are smarter than dogsmatchObj.group(1): Cats matchObj.group(2): matchObj.group(3): smarter than dogs

可見第二個括號里的內(nèi)容被默認為空了,然后刪去那個?,可以看到結果變成:

matchObj.group(): Cats are smarter than dogsmatchObj.group(1): Cats matchObj.group(2): smarter than dogsmatchObj.group(3):

那么這是否就意味著?的默認值很可能是0次,那?這個符號到底有什么用呢

仔細想來這個說法并不是很嚴謹。嘗試使用單獨的.?組合可以看到這個組合可以用于提取

單個不知道是否存在的字符,而如下代碼

import reline=’Cats are smarter than dogs’matchObj=re.match(r’(.*) are(.*)?’,line)if matchObj: print('matchObj.group():',matchObj.group()) print('matchObj.group(1):', matchObj.group(1)) print('matchObj.group(2):', matchObj.group(2))

也能在組別2中正常提取到are之后的字符內(nèi)容,但稍微改動一下將?放到第二個括號內(nèi),

就什么也提取不到,同時導致group(0)中匹配的字符到Cats are就截止了(也就是第二個括號匹配失敗)。

令人感到奇怪的是,如果將上面的代碼改成

import reline=’Cats are smarter than dogs’matchObj=re.match(r’(.*) are (.*)+’,line)if matchObj: print('matchObj.group():',matchObj.group()) print('matchObj.group(1):', matchObj.group(1)) print('matchObj.group(2):', matchObj.group(2))

也就是僅僅將?改為+,雖然能成功匹配整個line但group(2)中沒有內(nèi)容,

如果把+放到第二個括號中就會產(chǎn)生報錯,匹配失敗。

那么是否可以認為.*?這三個符號連用只是一個不規(guī)范的操作,但由于?的特殊性所以沒有報錯反而匹配成功了呢?

具體的可能要研究代碼本身的機理了,暫且擱置。還有一個問題就是如何達到樣例本身想要的,用第二個括號提取單個單詞的目的。

如果單單考慮這個例子的話,把原本第二個括號中的?換成r就可以了,也就是如下代碼:

import reline=’Cats are smarter than dogs’matchObj=re.match(r’(.*) are (.*r).*’,line)if matchObj: print('matchObj.group():',matchObj.group()) print('matchObj.group(1):', matchObj.group(1)) print('matchObj.group(2):', matchObj.group(2)) #print('matchObj.group(3):', matchObj.group(3))else: print(’No match!n’)

為了泛用性嘗試了一下把r改成‘ ’但是得到的結果是‘smarter than ’。于是嘗試把.換成表示任意字母的

[a-zA-Z],成功提取出了單個smarter,代碼如下:

import reline=’Cats are smarter than dogs’matchObj=re.match(r’(.*) are ([a-zA-Z]* ).*’,line)if matchObj: print('matchObj.group():',matchObj.group()) print('matchObj.group(1):', matchObj.group(1)) print('matchObj.group(2):', matchObj.group(2)) #print('matchObj.group(3):', matchObj.group(3))else: print(’No match!n’)

到此這篇關于python re.match()用法相關示例的文章就介紹到這了,更多相關python re.match()內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 北京公积金代办/租房发票/租房备案-北京金鼎源公积金提取服务中心 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 灰板纸、灰底白、硬纸板等纸品生产商-金泊纸业 | 生物制药洁净车间-GMP车间净化工程-食品净化厂房-杭州波涛净化设备工程有限公司 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | Q361F全焊接球阀,200X减压稳压阀,ZJHP气动单座调节阀-上海戎钛 | 成都办公室装修-办公室设计-写字楼装修设计-厂房装修-四川和信建筑装饰工程有限公司 | 超声波清洗机_细胞破碎仪_实验室超声仪器_恒温水浴-广东洁盟深那仪器 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 衢州装饰公司|装潢公司|办公楼装修|排屋装修|别墅装修-衢州佳盛装饰 | 北京软件开发_软件开发公司_北京软件公司-北京宜天信达软件开发公司 | 间苯二酚,间苯二酚厂家-淄博双和化工 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | ph计,实验室ph计,台式ph计,实验室酸度计,台式酸度计 | Honsberg流量计-Greisinger真空表-气压计-上海欧臻机电设备有限公司 | SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 | 标策网-专注公司商业知识服务、助力企业发展 | 法兰螺母 - 不锈钢螺母制造厂家 - 万千紧固件--螺母街 | 免费个人pos机申请办理-移动pos机刷卡-聚合收款码办理 | 平面钻,法兰钻,三维钻-山东兴田阳光智能装备股份有限公司 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 工业废水处理|污水处理厂|废水治理设备工程技术公司-苏州瑞美迪 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 学考网学历中心| 篮球架_乒乓球台_足球门_校园_竞技体育器材_厂家_价格-沧州浩然体育器材有限公司 | 偏心半球阀-电动偏心半球阀-调流调压阀-旋球阀-上欧阀门有限公司 | 上海诺狮景观规划设计有限公司| 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 窖井盖锯圆机_锯圆机金刚石锯片-无锡茂达金刚石有限公司 | 乐之康护 - 专业护工服务平台,提供医院陪护-居家照护-居家康复 | 酵素生产厂家_酵素OEM_酵素加盟_酵素ODM_酵素原料厂家_厦门益力康 | 气动隔膜泵厂家-温州永嘉定远泵阀有限公司 | 小型高低温循环试验箱-可程式高低温湿热交变试验箱-东莞市拓德环境测试设备有限公司 | 佛山市德信昌电子有限公司|