正規表示式練習筆記

2021-05-17 16:33:11 字數 657 閱讀 9531

看到[ ] 字元組(character classes) 這節,最後的例子,突然想到,如何來匹配不包含「abc」子字串的字串。寫來寫去,還就是寫不出來,照貓畫虎,寫了個^.*(?!abc).*(?!abc)$,看起來應該可以,跑出來不是那麼回事。對於如下的輸入:

abcklkjlkjk

lkjljalkl

kjlkabclk

lkjlkjlabc

kljkla

kljkljlj

可以判讀出"abcklkjlkjk"和"lkjlkjlabc",但對於"kjlkabclk"這種子字串在中間的情況,就不能解決。想著用個逆序否定,^.*(?!abc).*(?最後,在這裡使用正規表示式找出不包含特定字串的條目找到了解決方法:

當正則引擎解析到a區域的時候,就已經開始執行b區域的前瞻工作。這個時候發現當a區域為null的時候匹配成功——.*本來就允許匹配空字元,前瞻條件又滿足,a區域後面緊跟著的是「lkj」字串,而並不是abc。因此整個匹配過程成功匹配到所有條目。

於是,要把開頭的.*移到否定表示式裡面,變成^(?!.*abc).*(?!abc)$,就可以了,優化一下就是^(?!.*abc).*$,因為(?!.*abc)已經包括了開頭為任意字元,後面跟著abc的情況。

看的時候覺得差不多明白,要用的時候才發現,解決不了多少問題,還需要多練習啊。

正規表示式練習

取出其中的參考文獻,注意到每行只有乙個參考文獻,所以直接用 re.search regex,line import re with open test2 r as f lines f.readlines regex re.compile r a z reg open refer.txt w for ...

正規表示式練習

1 匹配一段文字中的每行的郵箱 y 123 qq.comaaa 163.combbb 126.comasdfasfs33333 adfcom import reret re.findall w qq 163 126 com y print ret 123 qq.com aaa 163.com bbb...

正規表示式練習

字元描述 匹配前面的子表示式零次或多次。例如,zo 能匹配 z 以及 zoo 等價於。匹配前面的子表示式一次或多次。例如,zo 能匹配 zo 以及 zoo 但不能匹配 z 等價於 匹配前面的子表示式零次或一次。例如,do es 可以匹配 do does 中的 does doxy 中的 do 1 va...