Python中字符的匹配
今天我們來聊一下Python中字符的匹配。所謂匹配字符串,即按指定規則提取數據,主要用于爬蟲和數據清洗。我們用代碼加注釋的形式來闡述這一部分內容,為此有必要針對下文做幾點說明:
1.下文代碼均編寫在同一個.py文件中
2.下文中橘黃色標注的為代碼,其余為注釋
3.為了方便讀者閱讀,我們將下文涉及的字符匹配的操作羅列如下,讀者可根據編號在下述代碼中查找相關內容,選擇想要閱讀的部分:
1.直接字符串匹配 ?2.任意字匹配? 3.范圍匹配 ?4.數字匹配\d ?5.非數字匹配
6.字母\w(漢字,字母,數字) ??7.非字母\W? 8.匹配空格\s ??9.匹配非空格\S? 10.*匹配
11.+匹配 ?12.?一次匹配 ?13.{}按照指定個數或范圍進行匹配 ?14.匹配指定開頭和結尾 ?
15.不在范圍內匹配 ??16.獲取分組數據匹配 ?17.指定多個固定的匹配規格 ?
18.給分組數據指定變量名稱 ?19.分組規則的重復使用,獲取標簽數據
?
?
#代碼部分
import re
# 使用re.match進行正則的編寫和數據提取
# 第一個參數,編寫正則表達式,編寫數據匹配規則
# 第二個參數,要匹配的字符串數據
# 需要有接受值接收返回結果
# 1.直接字符串匹配
r = re.match('ti', 'it')
try:
??? data = r.group()
except:
??? print('未匹配到數據')
else:
??? print(data)
# 從結果中獲取匹配的數據 r.group() ,可以定義變量接收數據,未匹配到數據則報錯
# 注意:正則的匹配順序是從第一個字符開始匹配,
# 如果第一個字符未匹配,則報錯('t' != 'i'),
# 直接字符串匹配時,根據第一個參數的全部內容進行匹配,即從如果匹配成功,匹配的結果就是第一個參數
?
?
# 2.任意字匹配
r = re.match('....', '北京.D')
data = r.group()
print(data)
結果為 北京.D
?
?
# 3.范圍匹配
r = re.match('[ads]', 'dhamsn')
data = r.group()
print(data)
# 結果為d,說明是將參數二中的字符拿來一一匹配
r = re.match('[ads][dhs][had]', 'dhamsn')
data = r.group()
print(data)
# 結果為dha
r = re.match('[a-z0-9A-Z][a-z0-9A-Z][a-z0-9A-Z]', 'sF0qg')
data = r.group()
print(data)
# 結果為sF0
?
?
# 4.數字匹配\d
r = re.match('\d\d', '89ih')
data = r.group()
print(data)
# 結果為68
?
?
# 5.非數字匹配
r = re.match('\D', 'h#j')
data = r.group()
print(data)
?
?
# 6.字母\w(漢字,字母,數字)
r = re.match('\w', '天di')
data = r.type()
print(data)
?
?
# 7.非字母\W
r = re.match('\W', '$10')
data = r.group()
print(data)
?
?
# 8.匹配空格\s
r = re.match('\s', ' as')
data = r.group()
print(data)
?
?
# 9.匹配非空格\S
r = re.match('\S', '&Gg2')
data = r.group()
print(data)
?
?
#多字符匹配
# 10.*匹配,可以匹配0至多個字符,若匹配0個,則返回空
r = re.match('\d*', 'yeasterday')
data = r.group()
print(data)
# 返回為空,不會報錯
r = re.match('\w*', 'fda677sa##$')
data = r.group()
print(data)
# 結果為fda677sa
# '.*'全匹配
?
?
# 11.+可以匹配一個或多個,若匹配不到會報錯
r = re.match('\d+', 'gerg46')
data = r.group()
print(data)
?
?
# 12.?進行一次匹配,匹配失敗返回空值
r = re.match('\d?', 'asd7')
data = r.group()
print(data)
?
?
# 13.{}按照指定個數或范圍進行匹配({m,n}匹配m到n位)
r = re.match('\w{2}', 'gerg46')
data = r.group()
print(data)
# 結果為ge
r = re.match('\w{2,4}', 'ger$g46')
data = r.group()
print(data)
# 結果為ger
?
?
# 14.匹配指定開頭和結尾
# ^匹配開頭
r = re.match('^\w+', 'ger$g46')
data = r.group()
print(data)
# 結果為ger
# $匹配結尾
r = re.match('\w+\W+$', 'ger$@')
data = r.group()
print(data)
# 結果為ger$@
?
?
?
# 15.不在范圍內匹配
r = re.match('[^iknh]', 'ger$g46')
data = r.group()
print(data)
# 結果為g
?
?
# 16.獲取分組數據,將數據拆分為多個部分,分別取出對應的值
# 郵箱匹配,用戶名@服務名.com,分別取出用戶名,服務名
r = re.match('(\w+)@(\w+).com','346@qq.com')
data = r.group(2)
print(data)
# 結果為qq,可見分組可以取出match方法內層括號里的內容,
# group(0)會取出包括內層括號外的所有內容,即346@qq.com
?
?
# 17.指定多個固定的匹配規格
r = re.match('(\w+)@(163|qq|sina|google).com', 'my@goole.com')
data = r.group(2)
print(data)
# (163|qq|sina|google|hrbeu)指定了匹配的規格,不在此規格內則報錯
?
?
# 18.給分組數據指定變量名稱?P<變量名>
r=re.match('(?P<user_name>\w+)@(?P<server_name>163|qq|sina|google).com', 'my@goole.com')
data = r.group('user_name')
print(data)
# 運行結果my.
?
?
# 19.分組規則的重復使用,取標簽數據
# r = re.match('<(.+)>.*<(/\\1)>', '<html>tryagain</html>')
r = re.match('<(?P<path>.+)>.*</(?P=path)>', '<html>tryagain</html>')
data = r.group()
print(data)
# 運行結果為 <html>tryagain</html>
總結
以上是生活随笔為你收集整理的Python中字符的匹配的全部內容,希望文章能夠幫你解決所遇到的問題。