Python 模塊 re (Regular Expression)

使用 Python 模塊 re 實現解析小工具

 

概要

在開發過程當中發現,Python 模塊 re(Regular Expression)是一個頗有價值而且很是強大的文本解析工具,於是想要分享一下此模塊的使用方法。php

有這樣一個簡單而有趣的實踐範例:對於喜歡追看美劇的年輕人,最新一集美劇的播出時間經常是一個讓人頭疼的問題,一個實時更新美劇播出時間表的小工具會很受歡迎。html

本文經過以上這個實例,描述如何抓獲 TV.com 網站上的文本信息,利用 Python 的 re 模塊進行解析,並將熱門美劇播出時間顯示在本身的網頁上,但願可以以娛樂的方式很好的解釋 re 模塊的用法。python

Python 正則表達式模塊 (re) 簡介

Python 的 re 模塊(Regular Expression 正則表達式)提供各類正則表達式的匹配操做,和 Perl 腳本的正則表達式功能相似,使用這一內嵌於 Python 的語言工具,儘管不能知足全部複雜的匹配狀況,但足夠在絕大多數狀況下可以有效地實現對複雜字符串的分析並提取出相關信息。Python 會將正則表達式轉化爲字節碼,利用 C 語言的匹配引擎進行深度優先的匹配。正則表達式

Python 正則表達式語法

正則表達式能夠包含普通字符和特殊字符,普通字符(好比數字或者字母)能夠直接對目標字符串進行匹配,在本文中咱們主要討論利用特殊字符來模糊匹配某一些字符串的方法,好比'|'或者'(',使用這些特殊字符,正則表達式能夠表示某一類的普通字符,或者是改變其周圍的正則表達式的含義。具體如表 2-1 所示:數據庫

表 1. 正則表達式語法

包含’ \ ’的特殊序列的意義如表 2-2:express

表 2. 正則表達式特殊序列

Python re 的主要功能

Python 的 re 正則表達式模塊定義了一系列函數,常量以及異常;同時,正則表達式被編譯成‘ RegexObject ’實例,自己能夠爲不一樣的操做提供方法。接下來簡要介紹一下這些函數的功能和用法。數組

compile緩存

re.compile(pattern[, flags])app

把正則表達式的模式和標識轉化成正則表達式對象,供 match() 和 search() 這兩個函數使用。ide

re 所定義的 flag 包括:

re.I 忽略大小寫

re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴於當前環境

re.M 多行模式

re.S 即爲’ . ’而且包括換行符在內的任意字符(’ . ’不包括換行符)

re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字符屬性數據庫

re.X 爲了增長可讀性,忽略空格和’ # ’後面的註釋

例:如下兩種用法結果相同:

A)

1
2
compiled_pattern = re.compile(pattern)
result = compiled_pattern.match(string)

B)

1
result = re.match(pattern, string)

search

re.search(pattern, string[, flags])

在字符串中查找匹配正則表達式模式的位置,返回 MatchObject 的實例,若是沒有找到匹配的位置,則返回 None。

對於已編譯的正則表達式對象來講(re.RegexObject),有如下 search 的方法:

search (string[, pos[, endpos]])

若 regex 是已編譯好的正則表達式對象,regex.search(string, 0, 50) 等同於 regex.search(string[:50], 0)。

具體示例以下。

1
2
3
>>> pattern = re.compile("a")
>>> pattern.search("abcde")     # Match at index 0
>>> pattern.search("abcde", 1)  # No match;

match

re.match(pattern, string[, flags])

判斷 pattern 是否在字符串開頭位置匹配。對於 RegexObject,有:

match(string[, pos[, endpos]])

match() 函數只在字符串的開始位置嘗試匹配正則表達式,也就是隻報告從位置 0 開始的匹配狀況,而 search() 函數是掃描整個字符串來查找匹配。若是想要搜索整個字符串來尋找匹配,應當用 search()。

split

re.split(pattern, string[, maxsplit=0, flags=0])

此功能很經常使用,能夠將將字符串匹配正則表達式的部分割開並返回一個列表。對 RegexObject,有函數:

split(string[, maxsplit=0])

例如,利用上面章節中介紹的語法:

1
2
3
4
5
6
>>> re.split('\W+', 'test, test, test.')
['test', 'test', 'test', '']
>>> re.split('(\W+)', ' test, test, test.')
[' test ', ', ', ' test ', ', ', ' test ', '.', '']
>>> re.split('\W+', ' test, test, test.', 1)
[' test ', ' test, test.']

對於一個找不到匹配的字符串而言,split 不會對其做出分割,如:

1
2
>>> re.split('a*', 'hello world')
['hello world']

findall

re.findall(pattern, string[, flags])

在字符串中找到正則表達式所匹配的全部子串,並組成一個列表返回。一樣 RegexObject 有:

findall(string[, pos[, endpos]])

示例以下:

1
2
#get all content enclosed with [], and return a list
>>> return_list = re.findall("(\[.*?\])",string)

finditer

re.finditer(pattern, string[, flags])

和 findall 相似,在字符串中找到正則表達式所匹配的全部子串,並組成一個迭代器返回。一樣 RegexObject 有:

finditer(string[, pos[, endpos]])

sub

re.sub(pattern, repl, string[, count, flags])

在字符串 string 中找到匹配正則表達式 pattern 的全部子串,用另外一個字符串 repl 進行替換。若是沒有找到匹配 pattern 的串,則返回未被修改的 string。Repl 既能夠是字符串也能夠是一個函數。對於 RegexObject 有:

sub(repl, string[, count=0])

此語法的示例有:

1
2
3
>>> p = re.compile( '(one|two|three)')
  >>> p.sub( 'num', 'one word two words three words')
'num word num words num words'

一樣能夠用如下方法,並指定 count 爲 1(只替換第一個):

>>> p.sub( 'num', ' one word two words three words', count=1)

' num word two words three words'

subn

re.subn(pattern, repl, string[, count, flags])

該函數的功能和 sub() 相同,但它還返回新的字符串以及替換的次數。一樣 RegexObject 有:

subn(repl, string[, count=0])

實例分析 - 使用 re 模塊實現美劇時間表

這一章節將描述使用 re 模塊進行文本解析並實現美劇播出時間表小工具的細節。咱們會引用實際的代碼片斷,解釋在實際程序中,應當如何使用 re 模塊實現文本解析的功能。

需求分析

爲了將咱們感興趣的信息所有提取出來渲染到一個單獨的頁面上,咱們選取 www.tv.com 的 html 做爲數據源,獲取到其 HTML 文本以後用正則表達式解析並得到相關內容。

請注意用正則表達式分析 HTML 或 XML 是痛苦的。隨處可見的變化使得寫出一個通用的正則表達式變得極爲困難,象這樣的任務使用專用的 HTML 或 XML 解析器更爲適宜 ( 如 http://www.crummy.com/software/BeautifulSoup/, 值得一提的是,這個解析器也是用 Python RE 實現的 ),爲了演示 Python RE 的使用,本文所有使用正則表達式處理文本。

實現步驟

由於此工具的最後結果會被呈如今一個網頁上,它的主要功能就是從上述的 html code 中提取出咱們感興趣的 element, 並按照咱們本身的對內容的選擇從新生成一個個性化過的頁面,請參見附件查看咱們將要解析的 html 文本。

經過檢視此 html 文件,咱們須要提取的 html element 只有被 head 標籤修飾的文檔信息元素,和被 div 標籤修飾,id 值爲 episode_listing 的塊級區域。

下面對實現這部分功能的主要代碼進行一些分析。

以只讀方式打開所需處理文本並讀入其內容:

1
2
fh = open("~/vampire_episode.html", "r")
fh_str = fd.read()

讀取劇集標題,使用正則表達式匹配以「<title」起始,「/title>」結束的元素,注意此處使用非貪婪匹配以獲取首次匹配的內容:

1
title = re.findall("< title. *?\/title>", fds)

查看一下變量類型和內容:

1
2
3
4
5
6
7
In [74]: type(title)
Out[74]: < type 'list'>
In [75]: print title
 
-------> print(title)
 
['< title >The Vampire Diaries Season 2 Episode Guide on TV.com</ title >']

讀取 html 文本中 id 值爲 episode_listing 的 div 元素,注意因爲此元素會跨越多行,咱們在調用 findall 函數時須要指定 re.S 標誌,一樣使用非貪婪匹配:

fd_result = re.findall("<div id=\"episode_listing\".*?\/div>", fh_str, re.S)

此時咱們已經獲取到所有所需內容,將他們寫入另外一個 html 文件:

1
2
3
4
5
6
7
output = open("parse_result.html", "w")
output.write('< html >< body >< h1 >The Air Date List you want to see:</ h1 >')
output.write('< br />')
output.write(title[0])
output.write(fd_result[0])
output.write("</ body ></ html >")
output.close()

結果演示

本章節將演示實例效果,展現最終能夠顯示在網頁上的運行結果,咱們將看到解析得到的美劇時間表,劇集標題等。爲此咱們在 Google App Engine 上建立了一個 Demo 示例以更好的對此本文所介紹的內容進行演示,讀者能夠直接訪問使用。示例的網址以下:

http://omtvdw.appspot.com/

下面咱們用截圖來講明該示例的內容。該示例主要展現了對給定的包含美劇信息的 URL 所截取出來的劇集播放信息,以下圖所示本示例展現以下三部美劇的信息:

圖 1. 美劇信息 URL

圖 1. 美劇信息 URL

其輸出結果以下:

圖 2-1. URL 所對應劇集播出時間表

圖 2-1. URL 所對應劇集播出時間表

圖 2-2. URL 所對應劇集播出時間表

圖 2-2. URL 所對應劇集播出時間表

圖 2-3. URL 所對應劇集播出時間表

圖 2-3. URL 所對應劇集播出時間表

另外,咱們還爲讀者提供了親自體驗的 Play Ground,讀者能夠經過點擊主頁面最下方的相關連接(http://omtvdw.appspot.com/pg)來到以下界面:

圖 3. 自行獲取指定美劇播出時間界面

圖 3. 自行獲取指定美劇播出時間界面

在此界面裏,讀者能夠自行輸入含有美劇播出信息的相關頁面的連接,而後查看輸出結果。例如咱們輸入 http://www.tv.com/24/show/3866/episode.html?shv=list&season=5,而後點擊「Get Air Date List」就會看到關於 24 小時第五季的播出信息:

圖 4. 運行結果

圖 4. 運行結果

讀者能夠自行試驗獲取其餘美劇的信息,可是須要本身從 www.tv.com 上找到相似的 URL。

小結

儘管對於 Python 正則表達式模塊(re)的語法和相關函數的描述並不全面,但文章以簡潔的方式介紹了最經常使用的正則表達式語法和函數調用方法,關於更爲複雜和深刻的用法討論,讀者能夠參考官方文檔。在以後的章節中,本文直觀地經過網頁文本解析的實例,講解了美劇播出時間解析小工具的實現方法和步驟,但願最後的網站示例和演示結果可以提供給這一模塊的功能學習提供一些有趣並有用的幫助。


 

 

正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),能夠用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。

例如:

  • runoo+b,能夠匹配 runoob、runooob、runoooooob 等,+ 號表明前面的字符必須至少出現一次(1次或屢次)。

  • runoo*b,能夠匹配 runob、runoob、runoooooob 等,* 號表明字符能夠不出現,也能夠出現一次或者屢次(0次、或1次、或屢次)。

  • colou?r 能夠匹配 color 或者 colour,? 問號表明前面的字符最多隻能夠出現一次(0次、或1次)。

構造正則表達式的方法和建立數學表達式的方法同樣。也就是用多種元字符與運算符能夠將小的表達式結合在一塊兒來建立更大的表達式。正則表達式的組件能夠是單個的字符、字符集合、字符範圍、字符間的選擇或者全部這些組件的任意組合。

正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱爲"元字符")組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式做爲一個模板,將某個字符模式與所搜索的字符串進行匹配。


普通字符

普通字符包括沒有顯式指定爲元字符的全部可打印和不可打印字符。這包括全部大寫和小寫字母、全部數字、全部標點符號和一些其餘符號。


非打印字符

非打印字符也能夠是正則表達式的組成部分。下表列出了表示非打印字符的轉義序列:

字符 描述
\cx 匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須爲 A-Z 或 a-z 之一。不然,將 c 視爲一個原義的 'c' 字符。
\f 匹配一個換頁符。等價於 \x0c 和 \cL。
\n 匹配一個換行符。等價於 \x0a 和 \cJ。
\r 匹配一個回車符。等價於 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。注意 Unicode 正則表達式會匹配全角空格符。
\S 匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。
\t 匹配一個製表符。等價於 \x09 和 \cI。
\v 匹配一個垂直製表符。等價於 \x0b 和 \cK。

特殊字符

所謂特殊字符,就是一些有特殊含義的字符,如上面說的 runoo*b 中的 *,簡單的說就是表示任何字符串的意思。若是要查找字符串中的 * 符號,則須要對 * 進行轉義,即在其前加一個 \: runo\*ob 匹配 runo*ob。

許多元字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符"轉義",即,將反斜槓字符\ 放在它們前面。下表列出了正則表達式中的特殊字符:

特別字符 描述
$ 匹配輸入字符串的結尾位置。若是設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符自己,請使用 \$。
( ) 標記一個子表達式的開始和結束位置。子表達式能夠獲取供之後使用。要匹配這些字符,請使用 \( 和 \)。
* 匹配前面的子表達式零次或屢次。要匹配 * 字符,請使用 \*。
+ 匹配前面的子表達式一次或屢次。要匹配 + 字符,請使用 \+。
. 匹配除換行符 \n 以外的任何單字符。要匹配 . ,請使用 \. 。
[ 標記一箇中括號表達式的開始。要匹配 [,請使用 \[。
? 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 \?。
\ 將下一個字符標記爲或特殊字符、或原義字符、或向後引用、或八進制轉義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("。
^ 匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符自己,請使用 \^。
{ 標記限定符表達式的開始。要匹配 {,請使用 \{。
| 指明兩項之間的一個選擇。要匹配 |,請使用 \|。

限定符

限定符用來指定正則表達式的一個給定組件必需要出現多少次才能知足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6種。

正則表達式的限定符有:

字符 描述
* 匹配前面的子表達式零次或屢次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。
+ 匹配前面的子表達式一次或屢次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。
? 匹配前面的子表達式零次或一次。例如,"do(es)?" 能夠匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等價於 {0,1}。
{n} n 是一個非負整數。匹配肯定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',可是能匹配 "food" 中的兩個 o。
{n,} n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的全部 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。
{n,m} m 和 n 均爲非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。

因爲章節編號在大的輸入文檔中會極可能超過九,因此您須要一種方式來處理兩位或三位章節編號。限定符給您這種能力。下面的正則表達式匹配編號爲任何位數的章節標題:

/Chapter [1-9][0-9]*/

請注意,限定符出如今範圍表達式以後。所以,它應用於整個範圍表達式,在本例中,只指定從 0 到 9 的數字(包括 0 和 9)。

這裏不使用 + 限定符,由於在第二個位置或後面的位置不必定須要有一個數字。也不使用 ? 字符,由於使用 ? 會將章節編號限制到只有兩位數。您須要至少匹配 Chapter 和空格字符後面的一個數字。

若是您知道章節編號被限制爲只有 99 章,可使用下面的表達式來至少指定一位但至多兩位數字。

/Chapter [0-9]{1,2}/

上面的表達式的缺點是,大於 99 的章節編號仍只匹配開頭兩位數字。另外一個缺點是 Chapter 0 也將匹配。只匹配兩位數字的更好的表達式以下:

/Chapter [1-9][0-9]?/

/Chapter [1-9][0-9]{0,1}/

*、+限定符都是貪婪的,由於它們會盡量多的匹配文字,只有在它們的後面加上一個?就能夠實現非貪婪或最小匹配。

例如,您可能搜索 HTML 文檔,以查找括在 H1 標記內的章節標題。該文本在您的文檔中以下:

<H1>Chapter 1 - 介紹正則表達式</H1>

貪婪:下面的表達式匹配從開始小於符號 (<) 到關閉 H1 標記的大於符號 (>) 之間的全部內容。

/<.*>/

非貪婪:若是您只須要匹配開始和結束 H1 標籤,下面的非貪婪表達式只匹配 <H1>。

/<.*?>/

若是隻想匹配開始的 H1 標籤,表達式則是:

/<\w+?>/

經過在 *、+ 或 ? 限定符以後放置 ?,該表達式從"貪心"表達式轉換爲"非貪心"表達式或者最小匹配。


定位符

定位符使您可以將正則表達式固定到行首或行尾。它們還使您可以建立這樣的正則表達式,這些正則表達式出如今一個單詞內、在一個單詞的開頭或者一個單詞的結尾。

定位符用來描述字符串或單詞的邊界,^ 和 $ 分別指字符串的開始與結束,\b 描述單詞的前或後邊界,\B 表示非單詞邊界。

正則表達式的定位符有:

字符 描述
^ 匹配輸入字符串開始的位置。若是設置了 RegExp 對象的 Multiline 屬性,^ 還會與 \n 或 \r 以後的位置匹配。
$ 匹配輸入字符串結尾的位置。若是設置了 RegExp 對象的 Multiline 屬性,$ 還會與 \n 或 \r 以前的位置匹配。
\b 匹配一個單詞邊界,即字與空格間的位置。
\B 非單詞邊界匹配。

注意:不能將限定符與定位符一塊兒使用。因爲在緊靠換行或者單詞邊界的前面或後面不能有一個以上位置,所以不容許諸如 ^* 之類的表達式。

若要匹配一行文本開始處的文本,請在正則表達式的開始使用 ^ 字符。不要將 ^ 的這種用法與中括號表達式內的用法混淆。

若要匹配一行文本的結束處的文本,請在正則表達式的結束處使用 $ 字符。

若要在搜索章節標題時使用定位點,下面的正則表達式匹配一個章節標題,該標題只包含兩個尾隨數字,而且出如今行首:

/^Chapter [1-9][0-9]{0,1}/

真正的章節標題不只出現行的開始處,並且它仍是該行中僅有的文本。它即出如今行首又出如今同一行的結尾。下面的表達式能確保指定的匹配只匹配章節而不匹配交叉引用。經過建立只匹配一行文本的開始和結尾的正則表達式,就可作到這一點。

/^Chapter [1-9][0-9]{0,1}$/

匹配單詞邊界稍有不一樣,但向正則表達式添加了很重要的能力。單詞邊界是單詞和空格之間的位置。非單詞邊界是任何其餘位置。下面的表達式匹配單詞 Chapter 的開頭三個字符,由於這三個字符出如今單詞邊界後面:

/\bCha/

\b 字符的位置是很是重要的。若是它位於要匹配的字符串的開始,它在單詞的開始處查找匹配項。若是它位於字符串的結尾,它在單詞的結尾處查找匹配項。例如,下面的表達式匹配單詞 Chapter 中的字符串 ter,由於它出如今單詞邊界的前面:

/ter\b/

下面的表達式匹配 Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt:

/\Bapt/

字符串 apt 出如今單詞 Chapter 中的非單詞邊界處,但出如今單詞 aptitude 中的單詞邊界處。對於 \B 非單詞邊界運算符,位置並不重要,由於匹配不關心到底是單詞的開頭仍是結尾。


選擇

用圓括號將全部選擇項括起來,相鄰的選擇項之間用|分隔。但用圓括號會有一個反作用,使相關的匹配會被緩存,此時可用?:放在第一個選項前來消除這種反作用。

其中 ?: 是非捕獲元之一,還有兩個非捕獲元是 ?= 和 ?!,這兩個還有更多的含義,前者爲正向預查,在任何開始匹配圓括號內的正則表達式模式的位置來匹配搜索字符串,後者爲負向預查,在任何開始不匹配該正則表達式模式的位置來匹配搜索字符串。


反向引用

對一個正則表達式模式或部分模式兩邊添加圓括號將致使相關匹配存儲到一個臨時緩衝區中,所捕獲的每一個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。緩衝區編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每一個緩衝區均可以使用 \n 訪問,其中 n 爲一個標識特定緩衝區的一位或兩位十進制數。

可使用非捕獲元字符 ?:、?= 或 ?! 來重寫捕獲,忽略對相關匹配的保存。

反向引用的最簡單的、最有用的應用之一,是提供查找文本中兩個相同的相鄰單詞的匹配項的能力。如下面的句子爲例:

Is is the cost of of gasoline going up up?

上面的句子很顯然有多個重複的單詞。若是能設計一種方法定位該句子,而沒必要查找每一個單詞的重複出現,那該有多好。下面的正則表達式使用單個子表達式來實現這一點:

實例

查找重複的單詞:

var str = "Is is the cost of of gasoline going up up"; var patt1 = /\b([a-z]+) \1\b/ig; document.write(str.match(patt1));

嘗試一下 »

捕獲的表達式,正如 [a-z]+ 指定的,包括一個或多個字母。正則表達式的第二部分是對之前捕獲的子匹配項的引用,即,單詞的第二個匹配項正好由括號表達式匹配。\1 指定第一個子匹配項。

單詞邊界元字符確保只檢測整個單詞。不然,諸如 "is issued" 或 "this is" 之類的詞組將不能正確地被此表達式識別。

正則表達式後面的全局標記 g 指定將該表達式應用到輸入字符串中可以查找到的儘量多的匹配。

表達式的結尾處的不區分大小寫 i 標記指定不區分大小寫。

多行標記指定換行符的兩邊可能出現潛在的匹配。

反向引用還能夠將通用資源指示符 (URI) 分解爲其組件。假定您想將下面的 URI 分解爲協議(ftp、http 等等)、域地址和頁/路徑:

http://www.runoob.com:80/html/html-tutorial.html

下面的正則表達式提供該功能:

實例

輸出全部匹配的數據:

var str = "http://www.runoob.com:80/html/html-tutorial.html"; var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/; arr = str.match(patt1); for (var i = 0; i < arr.length ; i++) { document.write(arr[i]); document.write("<br>"); }

嘗試一下 »

第三行代碼 str.match(patt1) 返回一個數組,實例中的數組包含 5 個元素,索引 0 對應的是整個字符串,索引 1 對應第一個匹配符(括號內),以此類推。

第一個括號子表達式捕獲 Web 地址的協議部分。該子表達式匹配在冒號和兩個正斜槓前面的任何單詞。

第二個括號子表達式捕獲地址的域地址部分。子表達式匹配 : 和 / 以後的一個或多個字符。

第三個括號子表達式捕獲端口號(若是指定了的話)。該子表達式匹配冒號後面的零個或多個數字。只能重複一次該子表達式。

最後,第四個括號子表達式捕獲 Web 地址指定的路徑和 / 或頁信息。該子表達式能匹配不包括 # 或空格字符的任何字符序列。

將正則表達式應用到上面的 URI,各子匹配項包含下面的內容:

    • 第一個括號子表達式包含 http
    • 第二個括號子表達式包含 www.runoob.com
    • 第三個括號子表達式包含 :80
    • 第四個括號子表達式包含 /html/html-tutorial.html
相關文章
相關標籤/搜索