App下載

Python--re正則入門教程,全程實(shí)操超詳細(xì)

猿友 2020-12-29 14:08:14 瀏覽數(shù) (3413)
反饋

Hello,大家好呀,我們今天的目標(biāo)是,30 分鐘內(nèi)明白正則表達(dá)式是什么,并對(duì)它有一些基本的了解,并且在自己的程序或網(wǎng)頁(yè)里使用它。本文全程實(shí)操,只要跟著練,你一定會(huì)有收獲。好課推薦:正則表達(dá)式淺析;實(shí)戰(zhàn)推薦:正則表達(dá)式

一、單字符匹配

1、匹配某個(gè)字符串:

text = "abcdef"

ret = re.match('a',text)

print(ret.group())

2、點(diǎn)(.):匹配任意的字符(除了'\n'):

text = "\nabcdef"

ret = re.match('.',text)

print(ret.group())

3、\d:匹配任意的數(shù)字:

text = "abcdef"

ret = re.match('\d',text)

print(ret.group())

4、\D:匹配任意的非數(shù)字:

text = "cabedf"

ret = re.match('\D',text)

print(ret.group())

5、\s:匹配的是空白字符(包括:\n,\t,\r和空格):

text = "\nabdef"

ret = re.match('\s',text)

print("*"*30)

print(ret.group())

print("*"*30)

6、\S:非空白字符:

text = "ababdef"

ret = re.match('\S',text)

print("*"*30)

print(ret.group())

print("*"*30)

7、\w:匹配的是a-z和A-Z以及數(shù)字和下劃線:

text = "1bc"

ret = re.match('\w',text)

print("*"*30)

print(ret.group())

print("*"*30)

8、\W:匹配的是和\w相反的:

text = "+bc"

ret = re.match('\W',text)

print("*"*30)

print(ret.group())

print("*"*30)

9、[] 組合的方式,只要滿足中括號(hào)中的某一項(xiàng)都算匹配成功:

text = "cba"

ret = re.match('[1c]',text)

print("*"*30)

print(ret.group())

print("*"*30)

10、使用組合的方式 [0-9] \d:

text = "abc"

ret = re.match('[^0-9]',text)  # ^符號(hào)表示非

print("="*30)

print(ret.group())

print("="*30)

11、使用組合的方式實(shí)現(xiàn) \w:

text = "+bc"

ret = re.match('[^a-zA-Z0-9_]',text)

print("="*30)

print(ret.group())

print("="*30)

二、多字符匹配

1、*:匹配 0 個(gè)或者多個(gè)字符:

text = "-cba"

result = re.match('\D*',text)

print(result.group())

2、+:匹配 1 個(gè)或者多個(gè)字符:

text = "1cba"

result = re.match('\w+',text)

print(result.group())

3、?:匹配前一個(gè)字符 0 個(gè)或者 1 個(gè):

text = "-cba"

result = re.match('\w?',text)

print(result.group())

4、{m}:匹配 m 個(gè)字符:

text = "+1cba"

result = re.match('\w{2}',text)

print(result.group())

5、{m,n}:匹配 m-n 之間的個(gè)數(shù)的字符:

text = "1cba+"

result = re.match('\w{1,3}',text)

print(result.group())

三、正則表達(dá)式案例

1、驗(yàn)證手機(jī)號(hào)碼:手機(jī)號(hào)碼的規(guī)則是以 1 為開頭,第二位可以是 34587,后面那 9 位可為任意數(shù)字。

text = "17751632549"

result = re.match("1[34587]\d{9}",text)

print(result.group())

2、驗(yàn)證郵箱:郵箱的規(guī)則是郵箱名稱是用數(shù)字、英文字符、下劃線組成的,然后是 @ 符號(hào),接著為域名。

text = "w3cschool@163.com"

result = re.match("\w+@[a-z0-9]+\.[a-z]+",text)

print(result.group())

3、驗(yàn)證 URL:URL 的規(guī)則是前面是 http 或者 https 或者是 ftp 然后再加上一個(gè)冒號(hào),再加上兩個(gè)斜杠,再后面就是可以出現(xiàn)任意非空白字符了。

text = "http://m.hgci.cn/minicourse/play/quick_scrapy"

result = re.match("(http|https|ftp)://\S+",text)

print(result.group())

4、驗(yàn)證身份證:身份證的規(guī)則是,總共有 18 位,前面 17 位都是數(shù)字,后面一位可以是數(shù)字,也可以是小寫的 x,也可以是大寫的 X。

text = "35215669985213654x"

result = re.match("\d{17}[\dxX]",text)

print(result.group())

四、開始/結(jié)束/貪婪和非貪婪

1、^:以...開頭:

text = "hello world"

result = re.search("^world",text)

print(result.group())

2、$:以...結(jié)尾:

text = "hello world"

result = re.search("hello$",text)

print(result.group())

text = ""

result = re.search("^$",text)

print(result.group())

3、|:匹配多個(gè)字符串或者表達(dá)式:

text = "http://m.hgci.cn/minicourse/play/quick_scrapy"

result = re.match("(http|https|ftp)://\S+",text)

print(result.group())

4、貪婪和非貪婪:

text = "12345"

result = re.search("\d+?",text)

print(result.group())

案例 1:提取 html 標(biāo)簽名稱:

text = "<h1>這是一級(jí)標(biāo)題</h1>"

result = re.search("<.+?>",text)

print(result.group())

案例 2:驗(yàn)證一個(gè)字符是不是 0-100 之間的數(shù)字:

text = "100"

result = re.match("0$|[1-9]\d?$|100$",text)

print(result.group())

四、轉(zhuǎn)義字符和原生字符串

1、Python 中的轉(zhuǎn)義字符:

text = r"hello\nw3cschool"

print(text)

2、正則表達(dá)式中的轉(zhuǎn)義字符:

text = "apple price is $9.9,range price is $8.8"

result = re.findall("\$\d+",text)

print(result)

3、原生字符串和正則表達(dá)式:

正則表達(dá)式的字符串解析規(guī)則:

  • 先把這個(gè)字符串放在 Python 語言層面進(jìn)行解析。
  • 把 Python 語言層面解析的結(jié)果再放到正則表達(dá)式層間進(jìn)行解析。

text = "\cba c"

result = re.match("\\\\c",text) # \\\\c =(Python語言層面)> \\c =(正則表達(dá)式層面)> \c

result = re.match(r"\\c",text) # \\c =(正則表達(dá)式層面)> \c

print(result.group())

五、分組

text = "apple price is $9.9,orange price is $8.8"

result = re.search('.+(\$\d+).+(\$\d+)',text)

print(result.groups())

group()/group(0):匹配整個(gè)分組

group(1):匹配第一個(gè)分組

group(2):匹配第二個(gè)分組

groups():獲取所有的分組

六、re 中常用的函數(shù)

1、findall:查找所有滿足條件的

text = "apple price is $9.9,orange price is $8.8"

result = re.findall(r'\$\d+',text)

print(result)

2、sub:根據(jù)規(guī)則替換其他字符串

text = "nihao zhongguo,hello w3cschool"

new_text = text.replace(" ","\n")

new_text = re.sub(r' |,','\n',text)

print(new_text)

html = """

<div class="job-detail">

     <p>1. 3年以上相關(guān)開發(fā)經(jīng)驗(yàn) ,全日制統(tǒng)招本科以上學(xué)歷</p>

     <p>2. 精通一門或多門開發(fā)語言(Python,C,Java等),其中至少有一門有3年以上使用經(jīng)驗(yàn)</p>

     <p>3. 熟練使用ES/mysql/mongodb/redis等數(shù)據(jù)庫(kù);</p>

     <p>4. 熟練使用django、tornado等web框架,具備獨(dú)立開發(fā) Python/Java 后端開發(fā)經(jīng)驗(yàn);</p>

     <p>5. 熟悉 Linux / Unix 操作系統(tǒng) </p>

     <p>6. 熟悉 TCP/IP,http等網(wǎng)絡(luò)協(xié)議</p>

     <p>福利:</p>

     <p>1、入職購(gòu)買六險(xiǎn)一金(一檔醫(yī)療+公司全額購(gòu)買商業(yè)險(xiǎn))+開門紅+全額年終獎(jiǎng)(1年13薪,一般會(huì)比一個(gè)月高)</p>

     <p>2、入職滿一年有2次調(diào)薪調(diào)級(jí)機(jī)會(huì)</p>

     <p>3、項(xiàng)目穩(wěn)定、團(tuán)隊(duì)穩(wěn)定性高,團(tuán)隊(duì)氛圍非常好(匯合員工占招行總員工比例接近50%);</p>

     <p>4、有機(jī)會(huì)轉(zhuǎn)為招商銀行內(nèi)部員工;</p>

     <p>5、團(tuán)隊(duì)每月有自己的活動(dòng)經(jīng)費(fèi),法定節(jié)假日放假安排;</p>

     <p>6、辦公環(huán)境優(yōu)良,加班有加班費(fèi)(全額工資為計(jì)算基數(shù),加班不超過晚上10點(diǎn),平日加班為時(shí)薪1.5倍,周末加班為日薪2倍,周末加班也可優(yōu)先選擇調(diào)休,管理人性化)。</p>

 </div>

"""

new_html = re.sub(r'<.+?>',"",html)

print(new_html)

3、split:根據(jù)規(guī)則分割字符串

text = "nihao zhongguo,hello world"

result = re.split(r' |,',text)

print(result)

4、compile:編譯正則表達(dá)式

text = "apple price is 34.56"

r = re.compile(r"""

 \d+ # 整數(shù)部分

 \.? # 小數(shù)點(diǎn)

 \d* # 小數(shù)部分

 """,re.VERBOSE)

result = re.search(r,text)

result = re.search(r"""

\d+ # 整數(shù)部分

\.? # 小數(shù)點(diǎn)

\d* # 小數(shù)部分

""",text,re.VERBOSE)

print(result.group())

如果想要在正則表達(dá)式中加注釋,那么需要在正則表達(dá)式的函數(shù)最后加一個(gè)`re.VERBOSE`。


1 人點(diǎn)贊