爬蟲常用的正則表達方式

2021-08-20 17:38:58 字數 2685 閱讀 8489

python裡的正則化庫re,使用方法:

import re

line = 'boooooobby123'

regex_str = "^b.*3$"

re.match(regex_str, line)

^

^a匹配以字元a開頭的字串

$

3$匹配以3結尾的字串

*

^b.*3$匹配以b開頭以3結尾的,中間有若干重複或不重複的字元(>=0)的字串

?

非貪婪匹配方式。如果要匹配字串'boooooobby123'的子串'boooooob'。 按正常的想法:

line = 'boooooobby123'

regex_str = ".*(b.*b).*"

match_obj = re.match(regex_str, line)

print(match_obj.group(1))

但是返回的結果是bb。這是因為預設的是從後向前的貪婪匹配。使用非貪婪的匹配方法:

regex_str = ".*?(b.*b).*"
但輸出結果是boooooobb因為雖然前面使用了非貪婪匹配,但後面還是貪婪的,所以應該是:

regex_str = ".*?(b.*?b).*"
+

前面字元至少出現一次,如b.+b匹配的就是bbb

限定字元出現的個數為2

限定出現字元個數超過2

限定出現字元個數在2到5之間

|

或關係

line = 'boobby123'

regex_str = "(bobby|boobby)123"

match_obj = re.match(regex_str, line)

print(match_obj.group(1))

結果為boobby,如果想取完整的再加乙個括號"((bobby|boobby)123)", 得到boobby123print(match_obj.group(2))得到boobby

代表滿足中括號裡的條件。[abcd]oobby123, 指第乙個字元是abcd中的任意乙個,[0-9]代表0-9之間的數,[^1]代表非1 。

比較常用的是匹配**號碼:

line = "18782902222"

regex_str = "(1[48357][0-9])"

match_obj = re.match(regex_str, line)

print(match_obj.group(1))

.

代表任意字元

\s

反斜槓小s:乙個空格符號

line = "你 好"

regex_str = "(你\s好)"

\s

反斜槓大s:乙個不為空格的符號

\w

反斜槓小w:指[a-za-z0-9_]中的任意字元

\w

反斜槓大w:指不為[a-za-z0-9_]字元的任意字元

[\u4e00-\u9fa5]

指出現漢字

line = "study in 清華大學"

regex_str = ".*?([\u4e00-\u9fa5]+大學)"

得到清華大學,如果沒有?則貪婪匹配到華大學

()

用來取子串

\d

提取數字

line = "***出生於2023年"

regex_str = ".*(\d)年"

# 或者 ".*?(\d+)年"

# 能滿足匹配下面的5種情況

line = "***出生於2023年6月"

line = "***出生於2001/6/1"

line = "***出生於2001-6-1"

line = "***出生於2001-06-01"

line = "***出生於2001-06"

regex_str = ".*出生於(\d[年/-]\d([月/-]\d|[月/-]$|$))"

文字的表達方式

文字的表達方式 1,直接寫中文名稱 div2,寫字型的英文名稱 div3,unicode編碼 字型名稱 英文名稱 unicode編碼 宋體 simsun 5b8b 4f53 微軟雅黑 microsoft yahei 5fae 8f6f 96c5 9ed1 新宋體 nsimsun 65b0 5b8b ...

IP位址表達方式

ipv4位址是四個位元組表述,最大表示範圍是 255.255.255.255 首先在 255.255.255.255 這麼大的乙個網路中有 4,294,967,294個可用ip 一台計算機在這麼大一群網路位址中想要快速路由到最終主機上很難實現,這相當於網路裝置在 資料報時,要在約 40億次的查詢才能...

linux連續指令的表達方式

連續指令的下達方式 這裡需要再提幾個重要的資訊,我們剛剛上面提過說,兩個指令先後寫在一起,可以這樣寫 command1 command2 利用分號 來分隔,這個分號的意思,代表不論 command1 執行結果為何,command2 都會 被執行 那麼如果我是兩個相關的指令,第乙個 command1 ...