Python 內(nèi)置的字符串處理函數(shù)能夠解決很多的字符串處理問題,但對于比較復雜的情況,內(nèi)置的字符串可能無法處理昔搂,或者處理過程顯得十分不優(yōu)雅句惯。為此土辩,我們需要掌握更強大的文本處理工具 - 正則表達式。
比如抢野,下面的例子拷淘,希望同時使用 .
和 :
作為分隔符切分字符串,就需要用到我們的正則表達式了:
>> import re
>> s = "10::29::30 root: 172.17.73.41 xxxxxxxxxxx"
>> re.split('[:.]+\s*', s)
['10', '29', '30 root', '172', '17', '73', '41 xxxxxxxxxxx']
正則表達式作為處理文本的強大工具指孤,具有非常優(yōu)秀的表達能力启涯。想必熟悉 Linux 系統(tǒng)的用戶可定對通配符很熟悉了,比如恃轩,列出文件名包含 .py
的所有文件:
mia@ubuntu:~$ ls -al *.py*
-rw-r--r-- 1 mia mia 220 Jun 30 08:31 mymode.py
-rw-r--r-- 1 mia mia 602 Jun 30 08:31 mymode.pyc
正則表達式的原理與通配符類似结洼,只不過通配符能匹配的文本范圍非常有限,而正則表達式功能更加強大详恼,相應的也更加復雜补君。
不過,在工作中昧互,很多時候我們只需要使用簡單的正則表達式挽铁,配合 Python 內(nèi)置的正則表達式處理函數(shù),即可在擁有強大表達能力的同時敞掘,降低正則表達式使用的難度叽掘。
合抱之木,生于毫末玖雁。九層之臺更扁,起于壘土。本篇文章,我們就先來了解正則表達式的常用語法浓镜,連載的后續(xù)文章溃列,將繼續(xù)更新 Python 使用正則表達式的具體內(nèi)容。
正則表達式好比工程師定義的過濾文本的模式膛薛。文本處理程序使用定義好的模式去過濾輸入的文本听隐,對于匹配模式的文本將會進一步處理,不匹配模式的文本將會被直接過濾哄啄。
因此雅任,定義模式以及熟悉模式的定義規(guī)則是正則表達式的核心。正則表達式由 普通文本 和 具有特殊意義的符號 組成咨跌。比如沪么,下面的例子中使用 [a-zA-Z]+
來匹配文本中的單詞:
>> s = "1. Python 之禪中提到:Simple is better than complex."
>> re.findall('[a-zA-Z]+', s)
['Python', 'Simple', 'is', 'better', 'than', 'complex']
再比如,使用 [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
來匹配 IP 地址:
>> s = "10::29::30 root: 172.17.73.41 xxxxxxxxxxx"
>> re.search('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}', s)
<re.Match object; span=(17, 29), match='172.17.73.41'>
上述的正則表達式匹配有點號分隔的 1 到 3 位數(shù)锌半,其中 [0-9]
表示數(shù)字取值范圍请祖,{1,3}
表示重復前面字符 1 ~ 3 次土思。
另外根灯,需要特別注意的是低千,.
在正則表達式中屬于特殊字符,因此這里使用 \.
轉(zhuǎn)義的方式來表示真正的點號運算冗澈。
下面钦勘,我們列出了正則表達式中最長使用的特殊符號及其含義:
正則表達式 | 描述 | 示例 |
---|---|---|
^ |
行起始標記 |
^import numpy 匹配 import numpy 開頭的行 |
$ |
行尾標記 |
import numpy$ 匹配 import numpy 結(jié)尾的行 |
. |
匹配任意一個字符 | - |
[] |
匹配包含在 [] 之中的任意字符 |
[pP]ython 匹配 python 和 Python |
[^] |
匹配 [^] 之外的任意一個字符 |
9[^56] 匹配 95 , 96 以外的 9x 文本 |
[-] |
匹配 [] 中指定范圍內(nèi)的任意一個字符 |
[0-9] 匹配 0~9 之間的任意一個數(shù)字;[a-z] 匹配 a~z 之間的任意一個字母 |
? |
匹配之前的項 0 次或 1 次 |
hel? 匹配 he hel
|
+ |
匹配之前的項 1 次或多次 |
hel+ 匹配 hel hell ... |
* |
匹配之前的項 0 次或多次 |
hel* 匹配 he hel hell ... |
{n} |
匹配之前的項 n 次 |
[0-9]{3} 匹配任意一個 3 位數(shù) |
{n,} |
匹配之前的項最少 n 次 |
[0-9]{3,} 匹配任意一個 3 位數(shù)或更多的數(shù)字 |
{n,m} |
匹配之前的項 n ~ m 次 |
[0-9]{2,5} 匹配 2 位數(shù)到 5 位數(shù)之間的任意一個數(shù)字 |
通過上表我們發(fā)現(xiàn)亚亲,正則表達式中 $
^
[
]
(
)
等諸多字符都有特別的含義彻采。如果希望他們作為普通字符,則需要使用轉(zhuǎn)義的方式使用捌归。