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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

写爬虫,不会正则怎么行?

發(fā)布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 写爬虫,不会正则怎么行? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、正則基礎(chǔ)1.1、基礎(chǔ)語法1.2、修飾符1.3、貪婪與懶惰2、正則進階2.1、捕獲分組2.2、零寬斷言2.3、條件匹配2.4、findall結(jié)語

導(dǎo)讀:正則在各語言中的使用是有差異的,本文以 Python 3 為基礎(chǔ)。本文主要講述的是正則的語法,對于 re 模塊不做過多描述,只會對一些特殊地方做提示。

很多人覺得正則很難,在我看來,這些人一定是沒有用心。其實正則很簡單,根據(jù)二八原則,我們只需要懂 20% 的內(nèi)容就可以解決 80% 的問題了。我曾經(jīng)有幾年幾乎每天都跟正則打交道,剛接手項目的時候我對正則也是一無所知,花半小時百度了一下,然后寫了幾個 demo,就開始正式接手了。三年多時間,我用到的正則鮮有超出我最初半小時百度到的知識的。

1、正則基礎(chǔ)

1.1、基礎(chǔ)語法

(1)常用元字符

語法描述
\b匹配單詞的開始或結(jié)束
\d匹配數(shù)字
\s匹配任意不可見字符(空格、換行符、制表符等),等價于[ \f\n\r\t\v]。
\w匹配任意 Unicode 字符集,包括字母、數(shù)字、下劃線、漢字等
.匹配除換行符(\n)以外的任意字符
^ 或 \A匹配字符串或行的起始位置
$ 或 \Z匹配字符串或行的結(jié)束位置

(2)限定詞(又叫量詞)

語法描述
*重復(fù)零次或更多次
+重復(fù)一次或更多次
?重復(fù)零次或一次
{n}重復(fù) n 次
{n,}重復(fù) n 次或更多次
{n,m}重復(fù) n 到 m 次

(3)常用反義詞

語法描述
\B匹配非單詞的開始或結(jié)束
\D匹配非數(shù)字
\S匹配任意可見字符, [^ \f\n\r\t\v]
\W匹配任意非 Unicode 字符集
[^abc]除 a、b、c 以外的任意字符

(4)字符族

語法描述
[abc]a、b 或 c
[^abc]除 a、b、c 以外的任意字符
[a-zA-Z]a 到 z 或 A 到 Z
[a-d[m-p]]a 到 d 或 m 到 p,即 [a-dm-p](并集)
[a-z&&[def]]d、e 或 f(交集)
[a-z&&[^bc]]a 到 z,除了 b 和 c:[ad-z](減去)
[a-z&&[^m-p]]a 到 z,減去 m 到 p:[a-lq-z](減去)

以上便是正則的基礎(chǔ)內(nèi)容,下面來寫兩個例子看下:

s?=?'123abc你好'
re.search('\d+',?s).group()
re.search('\w+',?s).group()

結(jié)果:

123
123abc你好

是不是很簡單?

1.2、修飾符

修飾符在各語言中也是有差異的。

Python 中的修飾符:

修飾符描述
re.A匹配 ASCII字符類,影響 \w, \W, \b, \B, \d, \D
re.I忽略大小寫
re.L做本地化識別匹配(這個極少極少使用)
re.M多行匹配,影響 和
re.S使 . 匹配包括換行符(\n)在內(nèi)的所有字符
re.U匹配 Unicode 字符集。與 re.A 相對,這是默認設(shè)置
re.X忽略空格和 # 后面的注釋以獲得看起來更易懂的正則。

(1)re.A

修飾符 A 使 \w 只匹配 ASCII 字符,\W 匹配非 ASCII 字符。

s?=?'123abc你好'
re.search('\w+',?s,?re.A).group()
re.search('\W+',?s,?re.A).group()

結(jié)果:

123abc
你好

但是描述中還有 \d 和 \D,數(shù)字不都是 ASCII 字符嗎?這是什么意思?別忘了,還有 全角和半角

s?=?'0123456789'????#?全角數(shù)字
re.search('\d+',?s,?re.U).group()

結(jié)果:

0123456789

(2)re.M
多行匹配的模式其實也不常用,很少有一行行規(guī)整的數(shù)據(jù)。

s?=?'aaa\r\nbbb\r\nccc'

re.findall('^[\s\w]*?$',?s)
re.findall('^[\s\w]*?$',?s,?re.M)

結(jié)果:

['aaa\r\nbbb\r\nccc']????????#?單行模式
['aaa\r',?'bbb\r',?'ccc']????#?多行模式

(3)re.S
這個簡單,直接看個例子。

s?=?'aaa\r\nbbb\r\nccc'

re.findall('^.*',?s)
re.findall('^.*',?s,?re.S)

結(jié)果:

['aaa\r']
['aaa\r\nbbb\r\nccc']

(4)re.X
用法如下:

rc?=?re.compile(r"""
\d+?#?匹配數(shù)字
#?和字母
[a-zA-Z]+
"""
,?re.X)
rc.search('123abc').group()

結(jié)果:

123abc

注意,用了 X 修飾符后,正則中的所有空格會被忽略,包括正則里面的原本有用的空格。如果正則中有需要使用空格,只能用 \s 代替。

(5)(?aiLmsux)
修飾符不僅可以代碼中指定,也可以在正則中指定。(?aiLmsux) 表示了以上所有的修飾符,具體用的時候需要哪個就在 ? 后面加上對應(yīng)的字母,示例如下,(?a) 和 re.A 效果是一樣的:

s?=?'123abc你好'
re.search('(?a)\w+',?s).group()
re.search('\w+',?s,?re.A).group()

結(jié)果是一樣的:

123abc
123abc

1.3、貪婪與懶惰

當正則表達式中包含能接受重復(fù)的限定符時,通常的行為是(在使整個表達式能得到匹配的前提下)匹配盡可能多的字符。

s?=?'aabab'
re.search('a.*b',?s).group()????#?這就是貪婪
re.search('a.*?b',?s).group()???#?這就是懶惰

結(jié)果:

aabab
aab

簡單來說:

  • 所謂貪婪,就是盡可能 的匹配;
  • 所謂懶惰,就是盡可能 的匹配。
  • *、+、{n,} 這些表達式屬于貪婪;
  • *?、+?、{n,}? 這些表達式就是懶惰(在貪婪的基礎(chǔ)上加上 ?)。

2、正則進階

2.1、捕獲分組

語法描述
(exp)匹配exp,并捕獲文本到自動命名的組里
(?Pexp)匹配exp,并捕獲文本到名稱為 name 的組里
(?:exp)匹配exp,不捕獲匹配的文本,也不給此分組分配組號
(?P=name)匹配之前由名為 name 的組匹配的文本

注意:在其他語言或者網(wǎng)上的一些正則工具中,分組命名的語法是 (?<name>exp) (?'name'exp) ,但在 Python 里,這樣寫會報錯:This named group syntax is not supported in this regex dialect。Python 中正確的寫法是:(?P<name>exp)

示例一:

分組可以讓我們用一條正則提取出多個信息,例如:

s?=?'姓名:張三;性別:男;電話:138123456789'
m?=?re.search('姓名[::](\w+).*?電話[::](\d{11})',?s)
if?m:
????name?=?m.group(1)
????phone?=?m.group(2)
????print(f'name:{name},?phone:{phone}')

結(jié)果:

name:張三,?phone:13812345678

示例二:

(?P<name>exp) 有時還是會用到的, (?P=name) 則很少情況下會用到。我想了一個 (?P=name) 的使用示例,給大家看下效果:

s?=?'''
<name>張三</name>
<age>30</age>
<phone>138123456789</phone>
'''


pattern?=?r'<(?P<name>.*?)>(.*?)</(?P=name)>'
It?=?re.findall(pattern,?s)

結(jié)果:

[('name',?'張三'),?('age',?'30'),?('phone',?'138123456789')]

2.2、零寬斷言

語法描述
(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面跟的不是exp的位置
(?<!exp)匹配前面不是exp的位置

注意:正則中常用的前項界定 (?<=exp) 和前項否定界定 (?<!exp) 在 Python 中可能會報錯:look-behind requires fixed-width pattern,原因是 python 中 前項界定的表達式必須是定長的,看如下示例:

(?<=aaa)????????#?正確
(?<=aaa|bbb)????#?正確
(?<=aaa|bb)????????#?錯誤
(?<=\d+)????????#?錯誤
(?<=\d{3})????????#?正確

2.3、條件匹配

這大概是最復(fù)雜的正則表達式了。語法如下:

語法描述
(?(id/name)yes|no)如果指定分組存在,則匹配 yes 模式,否則匹配 no 模式

此語法極少用到,印象中只用過一次。

以下示例的要求是:如果以 _ 開頭,則以字母結(jié)尾,否則以數(shù)字結(jié)尾。

s1?=?'_abcd'
s2?=?'abc1'

pattern?=?'(_)?[a-zA-Z]+(?(1)[a-zA-Z]|\d)'

re.search(pattern,?s1).group()
re.search(pattern,?s2).group()

結(jié)果:

_abcd
abc1

2.4、findall

Python 中的 re.findall 是個比較特別的方法(之所以說它特別,是跟我常用的 C# 做比較,在沒看注釋之前我想當然的掉坑里去了)。我們看這個方法的官方注釋:

Return?a?list?of?all?non-overlapping?matches?in?the?string.

If?one?or?more?capturing?groups?are?present?in?the?pattern,?return?
a?list?of?groups;?this?will?be?a?list?of?tuples?if?the?pattern?
has?more?than?one?group.

Empty?matches?are?included?in?the?result.

簡單來說,就是

  • 如果沒有分組,則返回整條正則匹配結(jié)果的列表;
  • 如果有 1 個分組,則返回分組匹配到的結(jié)果的列表;
  • 如果有多個分組,則返回分組匹配到的結(jié)果的元組的列表。

看下面的例子:

s?=?'aaa123bbb456ccc'

re.findall('[a-z]+\d+',?s)??????????#?不包含分組
re.findall('[a-z]+(\d+)',?s)????????#?包含一個分組
re.findall('([a-z]+(\d+))',?s)??????#?包含多個分組
re.findall('(?:[a-z]+(\d+))',?s)????#??:?不捕獲分組匹配結(jié)果

結(jié)果:

['aaa123',?'bbb456']
['123',?'456']
[('aaa123',?'123'),?('bbb456',?'456')]
['123',?'456']

零寬斷言中講到 Python 中前項界定必須是定長的,這很不方便,但是配合 findall 有分組時只取分組結(jié)果的特性,就可以模擬出非定長前項界定的效果了。

結(jié)語

其實正則就像是一個數(shù)學(xué)公式,會背公式不一定會做題。但其實這公式一點也不難,至少比學(xué)校里學(xué)的數(shù)學(xué)簡單多了,多練習(xí)幾次也就會了。

轉(zhuǎn)載于:https://www.cnblogs.com/gl1573/p/11363079.html

總結(jié)

以上是生活随笔為你收集整理的写爬虫,不会正则怎么行?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美成人午夜免费视在线看片 | 日韩爱爱视频 | 制服丝袜国产在线 | 国产精品一区麻豆 | 日韩欧美一卡二卡 | 免费毛片网站 | 中出在线 | 超碰个人在线 | 99色在线视频 | 91精品国产成人 | 天天插日日干 | 日本不卡一区 | 精品无码av在线 | 黄色小说在线观看视频 | 国产福利第一页 | 成人免费黄色片 | 久久人人爽人人爽人人片亚洲 | 色九九视频| 黄色av资源| 69精品无码成人久久久久久 | 国产亚洲视频在线 | av资源网在线 | 欧美老少做受xxxx高潮 | 欧美黄视频在线观看 | 天天干导航 | 成年人毛片 | 亚洲一区二区视频在线播放 | 日本精品一区 | 蜜臀av在线观看 | 好看的av网址 | 性xxxx搡xxxxx搡欧美 | 欧美三级免费观看 | 国产91在线视频观看 | 性欧美极品 | 无码一区二区三区免费 | 国产视频一区二区三区四区五区 | 黄色小视频在线播放 | 欧美一二 | 欧美综合自拍亚洲综合图片区 | 成人国产精品 | 欧美精品激情 | 狠狠操狠狠操 | 国产无精乱码一区二区三区 | 国产一区二区亚洲 | 久久久久久久影视 | 成人h动漫精品一区 | 蜜桃传媒一区二区亚洲 | 在线国产小视频 | 国产精品亚洲αv天堂无码 伊人性视频 | 国产一区二区三区电影在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 免费观看视频在线观看 | 日韩毛片在线播放 | 91成人福利在线 | 免费黄色片子 | 日韩一区二区毛片 | 波多野结衣mp4 | 伊人国产精品 | 国产中文一区二区 | 亚洲精品第一 | 日韩免费网站 | 中文字幕av一区二区 | 九色porny丨精品自拍视频 | 久久伊人五月天 | 亚洲最大的成人网站 | av天天在线 | 亚洲精品成人在线 | 一边摸上面一边摸下面 | 男女日批 | 国产视频在线观看一区 | 日本三级aaa | 天天插天天操 | 日本a级网站 | 国产色婷婷一区二区三区竹菊影视 | 成人福利在线看 | 伊人久久狼人 | 密臀久久 | 一区欧美| 少妇与公做了夜伦理69 | 欧美一区二区高清视频 | 特种兵之深入敌后高清全集免费观看 | 欧美少妇xx | 丁香六月色 | 国产精品久久久久久久久免费相片 | 久久精品综合视频 | 调教亲女小嫩苞h文小说 | 欧洲性生活视频 | 亚洲综合色吧 | 超碰在线超碰 | 91亚洲精品视频 | 日日操夜夜操天天操 | 五月天色网站 | 久久久经典 | 又粗又大又硬又长又爽 | 久久久九九九热 | 国产成人观看 | 中文字幕日韩精品一区 | 一区二区三区中文视频 | 久久av一区二区三区漫画 |