1. 程式人生 > >小白的正則表達式的學習之旅-03

小白的正則表達式的學習之旅-03

字符串 re模塊 捕獲 小寫 謝大 如果能 代碼 oob 功能

  通過前面的學習,相信大家已經能寫出簡單的正則表達式,並能夠進行簡單的正則查找,接下來的加添將會更加深入的學習正則表達式的語法,謝謝大家一直以來的支持。

5.選擇

  用圓括號將所有選擇項括起來,相鄰的選擇項之間用|分隔。但用圓括號會有一個副作用,使相關的匹配會被緩存,此時可用?:放在第一個選項前來消除這種副作用。 其中 ?: 是非捕獲元之一,還有兩個非捕獲元是 ?= 和 ?!,這兩個還有更多的含義,前者為正向預查,在任何開始匹配圓括號內的正則表達式模式的位置來匹配搜索字符串,後者為負向預查,在任何開始不匹配該正則表達式模式的位置來匹配搜索字符串。

6.反向引用

  對一個正則表達式模式或部分模式兩邊添加圓括號將導致相關匹配存儲到一個臨時緩沖區中,所捕獲的每個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。緩沖區編從 1 開始,最多可存儲 99 個捕獲的子表達式。每個緩沖區都可以使用 \n 訪問,其中 n 為一個標識特定緩沖區的一位或兩位十進制數。 可以使用非捕獲元字符 ?:、?= 或 ?! 來重寫捕獲,忽略對相關匹配的保存。   反向引用的最簡單的、最有用的應用之一,是提供查找文本中兩個相同的相鄰單詞的匹配項的能力。以下面的句子為例: Is is the cost of of gasoline going up up?   上面的句子很顯然有多個重復的單詞。如果能設計一種方法定位該句子,而不必查找每個單詞的重復出現,那該有多好。下面的正則表達式使用單個子表達式來實現這一點: 實例 查找重復的單詞:(代碼基於python3,可能會有縮進問題)
# 導入re模塊
impore re
str = "Is is the cost of of gasoline going up up"
result = re.reacher(" /\b([a-z]+) \1\b/ig",str)
print(result.group(1))
 

  

  捕獲的表達式,正如 [a-z]+ 指定的,包括一個或多個字母。正則表達式的第二部分是對以前捕獲的子匹配項的引用,即,單詞的第二個匹配項正好由括號表達式匹配。\1 指定第一個子匹配項。   字邊界元字符確保只檢測整個單詞。否則,諸如 "is issued" 或 "this is" 之類的詞組將不能正確地被此表達式識別。 正則表達式後面的全局標記 g 指定將該表達式應用到輸入字符串中能夠查找到的盡可能多的匹配。 表達式的結尾處的不區分大小寫 i 標記指定不區分大小寫。 多行標記指定換行符的兩邊可能出現潛在的匹配。 反向引用還可以將通用資源指示符 (URI) 分解為其組件。假定您想將下面的 URI 分解為協議(ftp、http 等等)、域地址和頁/路徑: http://www.runoob.com:80/html/html-tutorial.html 下面的正則表達式提供該功能: 實例 輸出所有匹配的數據:(代碼基於python3,可能會有縮進問題)
# 導入re模塊
impore re
str = "http://www.runoob.com:80/html/html-tutorial.html"
result = re.reacher(" /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/",str)

for i in len(result.group):
print(result.group(i))

  

第一個括號子表達式捕獲 Web 地址的協議部分。該子表達式匹配在冒號和兩個正斜杠前面的任何單詞。 第二個括號子表達式捕獲地址的域地址部分。子表達式匹配 : 和 / 之後的一個或多個字符。 第三個括號子表達式捕獲端口號(如果指定了的話)。該子表達式匹配冒號後面的零個或多個數字。只能重復一次該子表達式。 最後,第四個括號子表達式捕獲 Web 地址指定的路徑和 / 或頁信息。該子表達式能匹配不包括 # 或空格字符的任何字符序列。 將正則表達式應用到上面的 URI,各子匹配項包含下面的內容:
  • 第一個括號子表達式包含 http
  • 第二個括號子表達式包含 www.runoob.com
  • 第三個括號子表達式包含 :80
  • 第四個括號子表達式包含 /html/html-tutorial.html

小白的正則表達式的學習之旅-03