正則表達式——初次嘗試
雖然BeautifulSoup能幫助我們完成大部分的工作,但是我們還是有必要了解一下正則表達式的產生過程與基本規則的。
在學習正則之前呢,我問了自己幾個問題,下面的回答都是我自己的體會或者看別人的文章的啟發。
Q : 什麽是正則表達式?
** 1、正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串 替換 , 或者 從某個串中 取出 符合某個條件的子串等。
** 2、又稱規則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規則)的文本。
我們可以吧正則表達式比喻成一個 數學代數公式,現在你面前是一串由1000萬個無序數字組成的數字串,我要讓你從這個1000萬個數字中找到一段或多段能使剛剛那個數學代數式成立的數字。
估計以人類的力量,找半年也找不完吧,但是在程序中實現正則表達式的話,他能在很短的時間內匹配到我們想要數據。
Q : 他有什麽用?
正則表達式主要是針對字符串進行操作,可以簡化對字符串的復雜操作,其主要功能有匹配、切割、替換、獲取。正則表達式一定有很多用途,
但是就目前,我只用過正則來分析HTML網頁,從網頁代碼中匹配到我自己想要的東西。比如在一個包含很多超鏈接的網頁中,把所有的超鏈接匹配出來。
Q : 只有python才有正則表達式嗎?
幾乎都可以用,我只能說幾乎,使用正則表達式時,他們的基本規則時一樣的,有的可能會有擴展。
不同的語言(如PHP和JAVA)、相同語言的不同類庫(如來自Sun的Java Regular Expression類庫跟Apache Jakarta的正則表達式類庫)間,用法會有所差別,在使用的時候,要註意這些差別。
在python中,我們可以通過導入re庫,來使用正則表達式。
好了,那麽先體驗一下正則表達式到底有什麽強大的地方:http://tool.oschina.net/regex/#
正則表達式常用規則:
/*********************************
\w匹配字母數字及下劃線
\W匹配非字母數字及下劃線
\s匹配任意空白字符,等價於 [\t\n\r\f].
\S匹配任意非空字符
\d匹配任意數字,等價於 [0-9]
\D匹配任意非數字
\A匹配字符串開始
\Z匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串
\z匹配字符串結束
\G匹配最後匹配完成的位置
\n匹配一個換行符
\t匹配一個制表符
^匹配字符串的開頭
$匹配字符串的末尾。
.匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符。
[...]用來表示一組字符,單獨列出:[amk] 匹配 ‘a‘,‘m‘或‘k‘
[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
*匹配0個或多個的表達式。
+匹配1個或多個的表達式。
?匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式
{n}精確匹配n個前面表達式。
{n, m}匹配 n 到 m 次由前面的正則表達式定義的片段,貪婪方式
a|b匹配a或b
( )匹配括號內的表達式,也表示一個組
/*********************************************
在python中使用正則表達式時需要註意的地方:
1、在網頁匹配中,最好使用修飾符 re.S 使正則表達式可以匹配節點與節點之間的換行。
修飾符描述:
re.I使匹配對大小寫不敏感
re.L做本地化識別(locale-aware)匹配
re.M多行匹配,影響 ^ 和 $
re.S使 . 匹配包括換行在內的所有字符
re.U根據Unicode字符集解析字符。這個標誌影響 \w, \W, \b, \B.
re.X該標誌通過給予你更靈活的格式以便你將正則表達式寫得更易於理解。
在網頁匹配中較為常用的為re.S、re.I。
2、
貪婪匹配: .* 匹配盡可能多的字符,一般常用在表達式的結尾
非貪婪匹配: .*? 匹配盡可能少的字符,用在中間。
3、轉義匹配
當需要匹配的字符串中包含正則表達式定義的特殊字符時,在正則表達式中使用轉義字符來進行區別。具體使用和C語言中一樣。前面加反斜杠
4、match 和 search
match:從字符串的起始位置開始匹配,如果匹配,返回匹配結果,失敗返回None
search:掃描整個字符串,返回第一個匹配成功的內容。失敗返回None
大部分情況下,為了使用方便,都是用search
5、findall 獲取所有匹配的內容
該方法返回一個 list,list的每個元素都是 tuple 類型。然後遍歷整個list即可輸出每個匹配的內容。
results = re.findall(‘<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>‘, html, re.S)
for result in results:
print(result[1])
6、sub :匹配並替換文本,返回替換後的文本
比如去掉一個字符串中的所有數字:
content = ‘54aK54yr5oiR54ix5L2g‘
content = re.sub(‘\d+‘, ‘‘, content)
print(content)
就是先匹配出所有的數字,然後用空來替代即可。
利用這個技巧,可以先把一個HTML文本中的大部分無關的東西去掉,然後在進行匹配,可以方便很多。
7、compile :可以將正則表達式的字符串編譯成正則表達式對象,方便後面多次使用。相當於給正則表達式做了一層封裝。
8、使用group對正則表達式分組的時候,參數0對應整個匹配到的字符串,參數1才對應第一個分組。
參考資料:
https://blog.csdn.net/qq_878799579/article/details/72887612
https://www.cnblogs.com/luoshufang/p/5685784.html
正則表達式——初次嘗試