欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python正則表達式的應用詳解

 更新時間:2021年08月16日 17:29:57   作者:better meˇ:)  
這篇文章主要介紹了Python中正則表達式的詳細教程,正則表達式是Python學習進階當中的重要內(nèi)容,需要的朋友可以參考下,希望能給你帶來幫助

正則表達式的定義

在編寫處理字符串的程時,經(jīng)常會遇到在一段文本中查找符合某些規(guī)則的字符串的需求,正則表達式就是用于描述這些規(guī)則的工具,換句話說,我們可以使用正則表達式來定義字符串的匹配模式,即如何檢查一個字符串是否有跟某種模式匹配的部分或者從一個字符串中將與模式匹配的部分提取出來或者替換掉。

關(guān)于正則表達式的相關(guān)知識,大家可以閱讀一篇非常有名的博文叫《正則表達式30分鐘入門教程》,讀完這篇文章后你就可以看懂下面的表格,這是我們對正則表達式中的一些基本符號進行的扼要總結(jié)。

符號 解釋 示例 說明
. 匹配除換行符以外的任意字符 b.t 可以匹配bat / but / b#t / b1t等
\w 匹配字母/數(shù)字/下劃線/漢字 b\wt 可以匹配bat / b1t / b_t等,但不能匹配b#t
\s 匹配空白字符(包括\r、\n、\t等) love\syou 可以匹配love you
\d 匹配數(shù)字 \d\d 可以匹配01 / 23 / 99等
\b 匹配單詞的邊界 \bThe\b
^ 匹配字符串的開始 ^The 可以匹配The開頭的字符串
$ 匹配字符串的結(jié)束 .exe$ 可以匹配.exe結(jié)尾的字符串
\W 匹配非字母/數(shù)字/下劃線/漢字 b\Wt 可以匹配b#t / b@t等
但不能匹配but / b1t / b_t等
\S 匹配非空白字符 love\Syou 可以匹配love#you等
但不能匹配love you
\D 匹配非數(shù)字 \d\D 可以匹配9a / 3# / 0F等
\B 匹配非單詞邊界 \Bio\B
[] 匹配來自字符集的任意單一字符 [aeiou] 可以匹配任一元音字母字符
[^] 匹配不在字符集中的任意單一字符 [^aeiou] 可以匹配任一非元音字母字符
* 匹配0次或多次 \w*
+ 匹配1次或多次 \w+
? 匹配0次或1次 \w?
{N} 匹配N次 \w{3}
{M,} 匹配至少M次 \w{3,}
{M,N} 匹配至少M次至多N次 \w{3,6}
| 分支 foo|bar 可以匹配foo或者bar
(?#) 注釋
(exp) 匹配exp并捕獲到自動命名的組中
(?<name>exp) 匹配exp并捕獲到名為name的組中
(?:exp) 匹配exp但是不捕獲匹配的文本
(?=exp) 匹配exp前面的位置 \b\w+(?=ing) 可以匹配I'm dancing中的danc
(?<=exp) 匹配exp后面的位置 (?<=\bdanc)\w+\b 可以匹配I love dancing and reading中的第一個ing
(?!exp) 匹配后面不是exp的位置
(?<!exp) 匹配前面不是exp的位置
*? 重復任意次,但盡可能少重復 a.*b
a.*?b
將正則表達式應用于aabab,前者會匹配整個字符串a(chǎn)abab,后者會匹配aab和ab兩個字符串
+? 重復1次或多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{M,N}? 重復M到N次,但盡可能少重復
{M,}? 重復M次以上,但盡可能少重復

說明: 如果需要匹配的字符是正則表達式中的特殊字符,那么可以使用\進行轉(zhuǎn)義處理,例如想匹配小數(shù)點可以寫成\.就可以了,因為直接寫.會匹配任意字符;同理,想匹配圓括號必須寫成\(和\),否則圓括號被視為正則表達式中的分組。

Python對正則表達式的支持

Python提供了re模塊來支持正則表達式相關(guān)操作,下面是re模塊中的核心函數(shù)。

函數(shù) 說明
compile(pattern, flags=0) 編譯正則表達式返回正則表達式對象
match(pattern, string, flags=0) 用正則表達式匹配字符串 成功返回匹配對象 否則返回None
search(pattern, string, flags=0) 搜索字符串中第一次出現(xiàn)正則表達式的模式 成功返回匹配對象 否則返回None
split(pattern, string, maxsplit=0, flags=0) 用正則表達式指定的模式分隔符拆分字符串 返回列表
sub(pattern, repl, string, count=0, flags=0) 用指定的字符串替換原字符串中與正則表達式匹配的模式 可以用count指定替換的次數(shù)
fullmatch(pattern, string, flags=0) match函數(shù)的完全匹配(從字符串開頭到結(jié)尾)版本
findall(pattern, string, flags=0) 查找字符串所有與正則表達式匹配的模式 返回字符串的列表
finditer(pattern, string, flags=0) 查找字符串所有與正則表達式匹配的模式 返回一個迭代器
purge() 清除隱式編譯的正則表達式的緩存
re.I / re.IGNORECASE 忽略大小寫匹配標記
re.M / re.MULTILINE 多行匹配標記

說明: 上面提到的re模塊中的這些函數(shù),實際開發(fā)中也可以用正則表達式對象的方法替代對這些函數(shù)的使用,如果一個正則表達式需要重復的使用,那么先通過compile函數(shù)編譯正則表達式并創(chuàng)建出正則表達式對象無疑是更為明智的選擇。

示例

例1:驗證輸入的用戶名是否有效,用戶名由長度為6到20的字母、數(shù)字、下劃線組成

方法一:通過compile編譯正則表達式創(chuàng)建Pattern對象,通過給Pattern對象發(fā)消息實現(xiàn)匹配檢查。

import re

username = input('請輸入用戶名:')
# 通過compile編譯正則表達式創(chuàng)建Pattern對象
username_pattern = re.compile(r'^\w{6,20}$')
print(type(username_pattern))
# 通過給Pattern對象發(fā)消息實現(xiàn)匹配檢查
matcher = username_pattern.match(username)
print(type(matcher))
if matcher is None:
    print('無效的用戶名')
else:
    print(matcher.group())

方法二:不創(chuàng)建正則表達式對象,直接調(diào)用函數(shù)進行匹配操作

username = input('請輸入用戶名:')
matcher = re.fullmatch(r'\w{6,20}', username)
#^是開始符,$是結(jié)束符
# matcher = re.match(r'^\w{6,20}$', username)
if matcher is None:
    print('用戶名不合法?。?!')
else:
    print(matcher)
    print(matcher.group())

匹配操作可以使用match函數(shù),需要添加開始符號^和結(jié)束符號$表示匹配字符串的開始與結(jié)束;也可以使用fullmatch函數(shù),正則表達式不用寫開始符和結(jié)束符。上面在書寫正則表達式時使用了“原始字符串”的寫法。

例2:從字符串中找到與正則表達式匹配的部分

import re

content = """報警電話:110,我們班是Python-2105班,
我的QQ是9597658,我的手機號是13811223344,謝謝!"""

searcher = re.search(r'1[3-9]\d{9}', content)
if not searcher:
    print('沒有找到手機號')
else:
    print(searcher.group())

匹配結(jié)果:

13811223344

import re

content = """報警電話:110,我們班是Python-2105班,
我的QQ是9597658,我的手機號是13811223344,謝謝!"""

pattern = re.compile(r'\d+')
matcher = pattern.search(content)
while matcher:
    print(matcher.group())
    # 從上一次匹配成功的結(jié)束位置開始搜索
    matcher = pattern.search(content, matcher.end())

匹配結(jié)果:

110
2105
9597658
13811223344

import re

content = """報警電話:110,我們班是Python-2105班,
我的QQ是9597658,我的手機號是13811223344,謝謝!"""

pattern = re.compile(r'\d+')
results = pattern.findall(content)
# 沒有創(chuàng)建正則表達式對象時,也可以用這種方法
# results = re.findall(r'\d+', content)
for result in results:
    print(result)

匹配結(jié)果:

110
2105
9597658
13811223344

例3:從網(wǎng)頁上獲取新聞的標題和鏈接

import re

import requests

resp = requests.get('https://www.sohu.com/')
# .表示任意字符,+表示匹配一個或任意多個,?表示惰性匹配,盡可能短的匹配
pattern = re.compile(r'href="http.+?"')
# 拿到搜狐首頁
content = resp.text
matcher = pattern.search(content)
while matcher:
    print(matcher.group()[6:-1])
    matcher = pattern.search(content, matcher.end())

pattern2 = re.compile(r'title=".+?"')
title_list = pattern2.findall(content)
for title in title_list:
    print(title[7:-1])

對于例3,不能使新聞的標題和鏈接對應起來,如果使用正則表達式捕獲組,可以實現(xiàn)標題和鏈接的對應。

import re

import requests

resp = requests.get('https://www.sohu.com/')
# 匹配整個a標簽,但是只捕獲()中的內(nèi)容 ---> 正則表達式的捕獲組
# .*連在一起就意味著任意數(shù)量的不包含換行的字符
pattern = re.compile(r'<a\s.*?href="(.+?)".*?title="(.+?)".*?>')
content = resp.text
results = pattern.findall(content)
for href, title in results:
    print(title)
    if not href.startswith('https://www.sohu.com'):
         + href
    print(href)

例4:不良內(nèi)容過濾

import re

content = '你真是一個沙雕煞筆,F(xiàn)uck you!'
# pattern = re.compile(r'[傻沙煞][逼筆雕鄙]|馬化騰|fuck|shit', flags=re.IGNORECASE)
# modified_content = pattern.sub('*', content)
# print(modified_content)
# |表示分支
modified_content = re.sub(r'[傻沙煞][逼筆雕鄙]|fuck|shit', '*', content, flags=re.I)
print(modified_content)

例5:用正則表達式拆分字符串

import re

poem = '床前明月光,疑是地上霜,舉頭望明月,低頭思故鄉(xiāng)。'
# sentences_list = re.split(r'[,。]', poem)
# sentences_list = re.split(r',|。', poem)
pattern = re.compile(r'[,。]')
sentences_list = pattern.split(poem)
# sentences_list = [sentence for sentence in sentences_list if sentence]
# print(sentences_list)
for sentence in sentences_list:
    print(sentence)

運行結(jié)果:

床前明月光
疑是地上霜
舉頭望明月
低頭思故鄉(xiāng)

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Python中numpy.pad()函數(shù)的使用詳解

    Python中numpy.pad()函數(shù)的使用詳解

    這篇文章主要介紹了Python中numpy.pad()函數(shù)的使用詳解,在卷積神經(jīng)網(wǎng)絡(luò)中,為了避免卷積運算導致輸出圖像縮小和圖像邊緣信息丟失,常常采用圖像邊緣填充技術(shù),即在圖像四周邊緣填充0,使得卷積運算后圖像大小不會縮小,同時也不會丟失邊緣和角落的信息,需要的朋友可以參考下
    2023-10-10
  • python中upper是做什么用的

    python中upper是做什么用的

    在本篇文章里小編給大家整理的是一篇關(guān)于python中upper的作用的相關(guān)文章,有需要的朋友們可以參考下。
    2020-07-07
  • pandas讀取csv格式數(shù)據(jù)時header參數(shù)設(shè)置方法

    pandas讀取csv格式數(shù)據(jù)時header參數(shù)設(shè)置方法

    本文主要介紹了pandas讀取csv格式數(shù)據(jù)時header參數(shù)設(shè)置方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 使用Python實現(xiàn)保存剪貼板中的圖像

    使用Python實現(xiàn)保存剪貼板中的圖像

    這篇文章主要為大家詳細介紹了如何使用Python創(chuàng)建一個簡單的GUI應用程序,實現(xiàn)保存剪貼板中的圖像功能,文中的示例代碼講解詳細,需要的可以參考下
    2023-09-09
  • 從零開始學Python第八周:詳解網(wǎng)絡(luò)編程基礎(chǔ)(socket)

    從零開始學Python第八周:詳解網(wǎng)絡(luò)編程基礎(chǔ)(socket)

    本篇文章主要介紹了從零開始學Python第八周:詳解網(wǎng)絡(luò)編程基礎(chǔ)(socket) ,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • 如何通過50行Python代碼獲取公眾號全部文章

    如何通過50行Python代碼獲取公眾號全部文章

    這篇文章主要介紹了如何通過50行Python代碼獲取公眾號全部文章,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • python中快速進行多個字符替換的方法小結(jié)

    python中快速進行多個字符替換的方法小結(jié)

    最近在用python給自己的seo工作提高效率和節(jié)省時間,發(fā)現(xiàn)python真的很不錯,可以完成很多事情。多個字符替換是大家可能都會遇到的一個問題,昨天在工作中就碰到了這么一個問題,所以想著記錄一下解決方案及其過程,方便以后參考。下面來一起看看吧。
    2016-12-12
  • Pytest單元測試框架如何實現(xiàn)參數(shù)化

    Pytest單元測試框架如何實現(xiàn)參數(shù)化

    這篇文章主要介紹了Pytest單元測試框架如何實現(xiàn)參數(shù)化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 基于Python中Remove函數(shù)的用法討論

    基于Python中Remove函數(shù)的用法討論

    這篇文章主要介紹了基于Python中Remove函數(shù)的用法討論,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 如何用值獲取Python字典的鍵問題

    如何用值獲取Python字典的鍵問題

    這篇文章主要介紹了如何用值獲取Python字典的鍵問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論