現在有一道題目,要求利用python中re模組來匹配ip位址,我們應如何著手?
首先能想到的是ip位址是數字,正規表示式是如何匹配數字的呢?
\d或[0-9]
對於這個問題,不要一下子上來就寫匹配模式,應該一步步分解,把複雜的問題簡單化
比如ip位址,我們可以總結一下規律
1. 它是乙個字串
2. 字串內部是由4個1-3位的數字和3個.組成
3. 數字的範圍是0-255
接下來,我們先試一下匹配第1個數字
>>> importre>>> re.search(r"
\d\d\d
", "
192.168.100.123")
<_sre.sre_match object; span=(0, 3), match='
192'>
值得注意的是,由於正規表示式中的元字元 . 表示除了\n之外的任意乙個字元,我們需要匹配 . 本身,就需要用 \ 進行轉義
>>> re.search(r"\d\d\d\.
", "
192.168.100.12")
<_sre.sre_match object; span=(0, 4), match='
192.
'>
>>> re.search(r"\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d
", "
192.168.100.123")
<_sre.sre_match object; span=(0, 15), match='
192.168.100.123
'>
>>> re.search(r"\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d
", "
192.168.100.1")
>>>
很多人一上手,就寫成了[0-255],這不就是數字的範圍0-255嗎?我們說,這樣是不對的
正規表示式中,真正要匹配的永遠是字串,乙個字串內部是由三位的數字構成的,如果需要匹配三位數字的形式,就需要用到[0-9][0-9][0-9]或\d\d\d,用乙個[0-9]表示的只能匹配一位,[0-255]這種錯誤的寫法也只能匹配到一位0-9之間的數字
>>> re.search(r"[0-255]
", "
255"
)<_sre.sre_match object; span=(0, 1), match='
2'>
如下圖,第乙個[0-255]匹配到了1, \.匹配到了.
這個ip位址中根本沒有 1. 這種形式的,所以返回了none
>>> re.search(r"[0-255]\.[0-255]\.[0-255]\.[0-255]
", "
192.168.100.1")
>>>
既然上面的不對,那能不能把255分解成 2, 5, 5, 我們匹配時能否寫成[0-2][0-5][0-5],看似是沒問題的,我們來試試
>>> re.search(r"[0-2][0-5][0-5]
", "
192.168.100.1")
<_sre.sre_match object; span=(8, 11), match='
100'>
>>>
為什麼192沒有匹配到?168也沒有匹配到?因為數字的十位和個位最大只能是5,超過5的肯定沒法匹配
我們來看下0-255這個範圍,當百位是0或者1時,十位和個位可以是[0-9],也就是\d,當百位是2時,十位是[0-4]時,個位可以是\d,當百位是2時,十位是5時,個位只能是[0-5],那麼,我們是不是可以這樣來寫,比如匹配192,匹配模式可以寫成
[01]\d\d|2[0-4]\d|25[0-5]
如果有重複的,我們可以給上面的模式加上 表示重複匹配前面的字元n次
>>> re.search(r"(([01]\d\d|2[0-4]\d|25[0-5]\d)\.)([01]\d\d|2[0-4]\d|25[0-5]\d)
", "
192.168.100.123")
<_sre.sre_match object; span=(0, 15), match='
192.168.100.123
'>
看似正確了,但是還是匹配不到數字 1 ,因為我們的百位是[01],意味這如果是 1 的情況下,我們的結果是001,但ip位址是不能寫成001, 002的
>>> re.search(r"(([01]\d\d|2[0-4]\d|25[0-5]\d)\.)([01]\d\d|2[0-4]\d|25[0-5]\d)
", "
192.168.100.1")
>>>
>>> re.search(r"(([01]\d\d|2[0-4]\d|25[0-5]\d)\.)([01]\d\d|2[0-4]\d|25[0-5]\d)
", "
192.168.100.001")
<_sre.sre_match object; span=(0, 15), match='
192.168.100.001
'>
>>>
可以通過來優化,表示前面的字元重複0-1次,也可以用 ?
>>> re.search(r"(([01]\d\d|2[0-4]\d|25[0-5]\d)\.)([01]\d\d|2[0-4]\d|25[0-5]\d)
", "
192.168.100.1")
<_sre.sre_match object; span=(0, 13), match='
192.168.100.1
'>
>>> re.search(r"
(([01]?\d?\d|2[0-4]\d|25[0-5]\d)\.)([01]?\d?\d|2[0-4]\d|25[0-5]\d)
", "
192.168.100.1")
<_sre.sre_match object; span=(0, 13), match='
192.168.100.1
'>
這樣,當數字只有個位時,百位的0匹配0次,十位的0匹配0次,只留下個位數字[0-9]
PHP preg match 進行正規表示式匹配
preg match 函式用於進行正規表示式匹配,成功返回 1 否則返回 0 preg match 匹配成功一次後就會停止匹配,如果要實現全部結果的匹配,則需使用preg match all 函式。preg match pattern subject matches 引數 描述pattern 正規表...
python正規表示式元字元 正規表示式
字元 描述將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...
python利用正規表示式排除集合中字元的功能示例
前言 我們在之前學習過通過集合列舉的功能,把所有需要出現的字元列出來儲存在集合裡面,這樣正規表示式就可以根據集合裡的字元是否存在來判斷是否匹配成功,如果在集合裡,就匹配成功,否則不成功。現在有乙個問題,就是要把集合裡列出的字元都不能出現才匹配成功,這個需求怎麼樣實現呢?其實比較簡單,只需要在集合前面...