日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python爬取音乐神器_Python爬虫提取神器,正则表达式(re模块),全程干货!

發布時間:2025/3/20 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬取音乐神器_Python爬虫提取神器,正则表达式(re模块),全程干货! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python正則表達式(re模塊)

什么是正則表達式

正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a到z之間的字母)和特殊字符(稱為"元字符")。正則表達式使用但個字符串來描述、匹配一系列匹配某個句法規則的字符串。

正則字符簡單介紹

普通字符

普通字符包括沒有顯示指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母、所有數字、所有標點符號和一些其它符號

特殊字符

特別字符描述$匹配輸入字符串的結尾位置。如果設置了RegExp對象的Multline屬性,則$也匹配'\n'或'\r'。()匹配一個子表達式的開始和結束位置(匹配括號中的全部內容)。子表達式可以獲取供以后使用。*匹配前面的子表達式零次或多次。+匹配前面的子表達式一次或多次(至少有一次)。.匹配除換行符\n之外的任何單詞。[ ]匹配括號中一個字符,范圍描述 如[0-9 a-z A-Z]。?匹配前面的子表達式零次或一次,或指明一個非貪婪的限定。\轉義字符,如*表示匹配*號。^匹配字符串的開始位置(用在[ ]時,可以理解為取反,表示不匹配中括號中的字符串)。{}限定匹配的次數,如{n}表示匹配n個字符,{n,}表示至少匹配n個字符,{n,m}表示至少n個,最多m個(m和n均為非負整數)。|兩項中取一項。

非打印字符

非打印字符也可以是正則表達式的組成部分。

字符描述\b匹配一個單詞邊界,即字與空格間的位置。("This is Regex匹配單獨的單詞"is",正則就要寫成"\bis\b")。\d匹配數字。\w匹配字母,數字,下劃線。\s匹配空格。\B非單詞邊界匹配。\D匹配非數字。\W匹配非(字母,數字,下劃線)。\S匹配非空格。

量詞

量詞的三個重要概念

貪婪(貪心)如"*"字符,貪婪量詞會首先匹配整個字符串,嘗試匹配時,它會選定盡可能多的內容,如果失敗則回退一個字符,然后再次嘗試,回退的過程就叫做回溯,它會每次回退一個字符,直到找到匹配的內容或者沒有字符可以回退。相比下面兩種貪婪量詞對資源的消耗是最大的。

懶惰(勉強)如"?",懶惰量詞使用另一種方法匹配,它從目標的起始位置開始嘗試匹配,每檢查一個字符,并尋找它要匹配的內容,如此循環直到字符串結尾處。

占有如"+",占有量詞很像貪心式量詞,它會選擇盡可能多的內容,然后嘗試尋找匹配內容,但它只嘗試一次,不會回溯。就好比先抓一把石頭,然后從石頭中挑出黃金。

re模塊中常用功能函數

compile()

編譯正則表達式模式,返回一個對象的模式。(可以把一些常用的正則表達式編譯成正則表達式對象,這樣可以提高效率)。

re.compile(pattern,flags=0)

pattern:編譯時用的表達式字符串。

flags:編譯標志位,用于修改正則表達式,如:是否區分大小寫,多行匹配等。常用的flags有:

標志含義re.S(DOTALL)使.匹配包括換行符在內的所有字符。re.I(IGNORECASE)是匹配對大小寫不敏感。re.L(LOCALE)做本地化識別(locale-aware)匹配,法語等。re.M(MULTILINE)多行匹配,影響^和$。re.X(VERBOSE)該標志通過給予更靈活的格式以便將正則表達式寫的更易于理解。re.U根據Unicode字符集解析字符,這個標志影響\w、\W、\b、\B

import re

# 將正則表達式編譯成pattern對象

pattern = re.compile("\d+")

pattern對象的常用方法有:match()、search()、finall()、finder()、split()、sub()、subn()。

(1)match()方法

該方法用于查找字符串的頭部,它只要找到一個匹配的結果就返回。(這個方法并不是完全匹配。當pattern結束時若string還要剩余字符,仍然視為成功。想要完全匹配,可以在表達式末尾加上邊界匹配符'$')。

match(pattern, string,pos=0,endpos=-1)

說明:string是待匹配的字符串,pos和endpos指定字符串的起始和終點的位置,當不指定是,默認從頭部開始匹配,當匹配成功是,返回Match對象。

import re

pattern = re.compile("\\d+")

match = pattern.match("aaa123bbb123ccc123")

print(match)# None(從頭部開始匹配)

match = pattern.match("aaa123bbb123ccc123", 3, 6)

print(match) # <_sre.sre_match object span="(3," match="123">

print(match.group())# 123,返回匹配的字符串,如果需要獲得整個匹配的字符串時,可以使用group()或者group(0)

print(match.start())# 3,返回匹配的字串在整個字符串的起始位置

print(match.end())# 6,返回匹配的字串在整個字符串的結束位置

print(match.span())# (3, 6),返回(start(), end())

(2) serach()方法

search(pattern, string,pos=0,endpos=-1)

說明:匹配成功時返回Match對象,匹配不成功時返回None。

import re

pattern = re.compile("\\d+")

match = pattern.search("aaaa1111bbbb1234cccc1243")

print(match)# <_sre.sre_match object span="(4," match="1111">

match = pattern.search("aaaa1111bbbb1234cccc1243", 3, 6)

print(match)# <_sre.sre_match object span="(4," match="11">

print(match.group())# 11

print(match.start())# 4

print(match.end())# 6

print(match.span())# (4, 6)

(3)findall()方法

該方法返回所有的匹配結果。

findall(pattern, string, pos, endpos=-1)

說明:匹配成功,返回匹配的列表,匹配不成功,返回空列表。

import re

pattern = re.compile("\\d+")

match = pattern.findall("aaaa1111bbbb1234cccc1243")

print(match)# ['1111', '1234', '1243']

(4)finditer()方法

finditer(pattern, string, pos=0, endpos=-1)

?說明:匹配所有的字符串,返回所有匹配字符串,但是它返回的是一個迭代器,通過該迭代器我們可以訪問匹配的每一個字符串。

import re

pattern = re.compile("\\d+")

result_iter = pattern.finditer("aaaa1111bbbb1234cccc1243")

for result in result_iter:

print("找得到字符串{},位置是{}".format(result.group(), result.span()))

# 找得到字符串1111,位置是(4, 8)

# 找得到字符串1234,位置是(12, 16)

# 找得到字符串1243,位置是(20, 24)

(5)split()方法

split(pattern, string, maxsplit=0)

說明:用來分割字符串,maxsplit表示最大的分割次數,不指定即為全部分割。

import re

print(re.split('\d+', 'one1two2three3four4five5'))

# ['one', 'two', 'three', 'four', 'five', '']

(6)sub()方法

sub(pattern, repl, string, count=0, flags=0)

說明:該方法用來替換。rel如果為字符串,會使用rel替換字符串中的每一個匹配的子串,并且返回替換后的字符串;如果為函數,則該函數應該只接收一個Match對象,并且返回一個字符串用于替換。

count用于指定替換次數。

import re

p = re.compile(r'(\w+) (\w+)')

s = 'test aaa,test bbb'

def func(m):

return 'hei' + ' ' + m.group(2)

print(p.sub(r'hello world', s))# hello world,hello world(使用hello world替換)

print(p.sub(r'\2 \1', s)) # aaa test,bbb test(\1 上方第一個括號內的內容。)

print(p.sub(func, s))# hei aaa,hei bbb(替換全部)

print(p.sub(func, s, 1))# hei aaa,test bbb(最多只替換一次)

(7)subn()方法

subn(pattern, repl, string, count=0, flags=0)

說明:該方法也是用于替換,返回一個元祖,元祖有兩個元素,第一個和使用sub方法返回的結果一樣,count表示替換的次數。

import re

p = re.compile(r'(\w+) (\w+)')

s = 'test aaa,test bbb'

def func(m):

return 'hei' + ' ' + m.group(2)

print(p.subn(r'hello world', s))# ('hello world,hello world', 2)

print(p.subn(r'\2 \1', s)) # ('aaa test,bbb test', 2) (\1 上方第一個括號內的內容。)

print(p.subn(func, s))# ('hei aaa,hei bbb', 2)

print(p.subn(func, s, 1))# ('hei aaa,test bbb', 1)

一些注意點

1、re.match與re.search 與re.findall 的區別:

re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。re.findall返回所有的匹配結果。

import re

p = re.compile(r'[\d]')

s = 'abc33'

print(p.search(s).group())# 3

print(p.match(s))# None

print(p.findall(s))# ['3', '3']

2、貪婪匹配與非貪婪匹配

*,+,?等都是貪婪匹配,也就是盡可能多的匹配,后面加上?號使其變成

惰性匹配。

import re

a = re.findall(r'a(\d+?)', 'a23b')

print(a)

b = re.findall(r'a(\d+)', 'a23b')

print(b)

注意:如果前后均有限定條件的時候,就不存在什么貪婪模式了,非匹配模式失效。

import re

a = re.findall(r'a(\d+)b', 'a3333b')

print(a)

b = re.findall(r'a(\d+?)b', 'a3333b')

print(b)

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的python爬取音乐神器_Python爬虫提取神器,正则表达式(re模块),全程干货!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。