3.3.1 反向引用

英文中不少單詞中都有重疊出現(xiàn)的字母屈溉,比如shootbeep,如果希望檢查某個單詞是否包含重疊出現(xiàn)的字母抬探,該怎么解決子巾?

匹配字母表達式是[a-z](這里暫不考慮大寫的情況)。但“重疊出現(xiàn)”的字母小压,取決于第一個[a-z]運行時的匹配結(jié)果线梗,而不能預先設(shè)定。也就是說必須“知道”之前匹配的確切內(nèi)容:如果前面匹配的是e怠益,則后面只能是e仪搔;如果前面匹配的是a,后面就只能匹配a蜻牢。

上一節(jié)講到了引用分組烤咧,能引用某個分組內(nèi)的子表達式匹配的文本,但是引用都是在匹配完成后進行的抢呆,能不能在正則表達式中引用呢煮嫌?

答案是可以的,這種功能叫做反向引用(back-reference)抱虐,它允許在正則表達式內(nèi)部引用之前(左側(cè))的捕獲分組匹配的文本昌阿,其形式也是\num,其中num表示所引用分組的編號,編號規(guī)則與之前介紹的相同宝泵。

根據(jù)反向引用,查找連續(xù)重疊字母的表達式就是([a-z])\1轩娶,其中的[a-z]匹配第一個字母儿奶,再用括號將匹配分組,然后用\1來反向引用鳄抒。

例3-24 用反向引用匹配重復字母

print(re.search(r'([a-z])\1', 'aabb'))  # 'aa'
print(re.search(r'([a-z])\1', 'cc'))  # 'cc'
print(re.search(r'([a-z])\1', 'mn'))  # None

在日常開發(fā)中闯捎,我們經(jīng)常需要反向引用來建立前后聯(lián)系。最常見的就是解析html tag许溅。在html語法中瓤鼻,tag包括open tagclose tag,它們經(jīng)常是成對出現(xiàn)的贤重,比如<bold>馬小跳</bold>茬祷、<h1>title</h1>

有了反向引用并蝗,就可以先匹配open tag祭犯,再匹配其他內(nèi)容,直到最近的close tag為止:用([^>]+)匹配open tagtag name滚停,在匹配close tag時沃粗,用\1引用之前匹配的tag name

例3-25 用反向引用匹配成對的tag

pairedTagRegex = re.compile(r'<([a-zA-Z0-9]+)(\s*[^>]+)?>[\s\S]*?</\1>')

print(pairedTagRegex.search('<bold name="">馬小跳</bold>'))  # <bold name="">馬小跳</bold>
print(pairedTagRegex.search('<h1 src="mxt">馬小跳</h1>'))  # <h1 src="mxt">馬小跳</h1>
print(pairedTagRegex.search('<h1><span>馬小跳</span></h1>'))  # <span>馬小跳</span>

反向引用還可以用在其他很多地方键畴,比如處理中文文本時最盅,查找“浩浩蕩蕩”、“明明白白”之類aabb或者“如火如荼”起惕、“越來越好”這類abab的四字詞語涡贱。

關(guān)于反向引用,還有一點需要強調(diào):反向引用重復的是對應(yīng)捕獲分組匹配的文本惹想,而不是之前的表達式盼产;也就是說,反向引用的是由之前表達式?jīng)Q定的具體文本勺馆,而不是符合某種規(guī)則的未知文本戏售。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市草穆,隨后出現(xiàn)的幾起案子灌灾,更是在濱河造成了極大的恐慌,老刑警劉巖悲柱,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锋喜,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機嘿般,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門段标,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炉奴,你說我怎么就攤上這事逼庞。” “怎么了瞻赶?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵赛糟,是天一觀的道長。 經(jīng)常有香客問我砸逊,道長璧南,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任师逸,我火速辦了婚禮司倚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘篓像。我一直安慰自己对湃,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布遗淳。 她就那樣靜靜地躺著拍柒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屈暗。 梳的紋絲不亂的頭發(fā)上拆讯,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音养叛,去河邊找鬼种呐。 笑死,一個胖子當著我的面吹牛弃甥,可吹牛的內(nèi)容都是我干的爽室。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼淆攻,長吁一口氣:“原來是場噩夢啊……” “哼阔墩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瓶珊,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤啸箫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伞芹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忘苛,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡蝉娜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扎唾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片召川。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胸遇,靈堂內(nèi)的尸體忽然破棺而出荧呐,到底是詐尸還是另有隱情,我是刑警寧澤狐榔,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布坛增,位于F島的核電站获雕,受9級特大地震影響薄腻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜届案,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一庵楷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧楣颠,春花似錦尽纽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矫膨,卻和暖如春差凹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侧馅。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工危尿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馁痴。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓谊娇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罗晕。 傳聞我的和親對象是個殘疾皇子济欢,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容