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

一文帶你輕松搞定Python正則匹配

 更新時間:2024年08月15日 10:26:09   作者:知識充實人生  
在python?中,正則匹配用到的還是挺多的,下面這篇文章主要給大家介紹了關(guān)于Python正則匹配的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、前言

日常工作中,不可避免需要進(jìn)行文件及內(nèi)容的查找,替換操作,python的正則匹配無疑是專門針對改場景而出現(xiàn)的,靈活地運用可以極大地提高效率,下圖是本文內(nèi)容概覽。

二、正則表達(dá)式符號

對于所有的正則匹配表達(dá)式,都可由4部分組成:基礎(chǔ)字符,次數(shù)匹配,位置匹配,分組匹配,即

正則匹配表達(dá)式= 基礎(chǔ)字符(必選)+次數(shù)匹配(可選)+位置匹配(可選)+分組匹配(可選)

2.1 基礎(chǔ)字符

基礎(chǔ)字符主要是對應(yīng)與具體的匹配對象,常用的如下表,其中涉及有特殊含義的字符,如.,*,^,$等,如果要匹配該字符本身,需要使用轉(zhuǎn)移符號"\"。

代碼示例:

import re
string="lucky^ /696/   ^money \Healthy **"
pattern_num=re.compile("\d")  #匹配數(shù)字
num=pattern_num.findall(string)
pattern_letter=re.compile("\w")   #匹配字母或數(shù)字
letter=pattern_letter.findall(string)
pattern_blank=re.compile("\s")   #匹配空格
blank=pattern_blank.findall(string)
pattern_slash=re.compile(r"\\")    #匹配反斜杠\
slash=pattern_slash.findall(string)
pattern_tri=re.compile("\^")    #匹配特殊字符^
tri=pattern_tri.findall(string)
print("num:%s\nletter:%s\nblank:%s\nslash:%s\ntri:%s"%(num,letter,blank,slash,tri))

查詢結(jié)果,注意\s表示單個空格,連續(xù)兩個空格是作為兩個結(jié)果,單反斜杠\的結(jié)果slash表示用“\\”,如果使用print函數(shù)打印查看實際是單斜杠\

2.2 匹配次數(shù)

在設(shè)置了具體匹配字符后,還可以對字符匹配的數(shù)量進(jìn)行限制,即在匹配字符后面加上匹配次數(shù)字符即可

代碼示例

import re
string="lucky^ \/696/\   ^money//  \Healthy 12**"
pattern_num=re.compile("\d+")  #匹配至少1個數(shù)字
num=pattern_num.findall(string)
pattern_letter=re.compile("\w{4,5}")   #匹配4-5個字母或數(shù)字
letter=pattern_letter.findall(string)
pattern_blank=re.compile("\s{3}")   #匹配3個連續(xù)的空格
blank=pattern_blank.findall(string)
pattern_slash=re.compile(r"/{2,}")    #匹配至少兩個反斜杠//
slash=pattern_slash.findall(string)
pattern_tri=re.compile("\d|\^")    #匹配數(shù)字或特殊字符^
tri=pattern_tri.findall(string)
print("num:%s\nletter:%s\nblank:%s\nslash:%s\ntri:%s"%(num,letter,blank,slash,tri))

查詢結(jié)果

2.3 匹配位置

同限制匹配字符的數(shù)量類似,可以設(shè)置匹配字符的位置,如指定開頭或結(jié)尾的字符

代碼示例

import re
string="luckyhappy happy-dog /happy, happy_test ^money  Healthy 12**happy**"
pattern_head=re.compile("^luc")  #匹配以luc開頭的字符
head=pattern_head.findall(string)  #匹配成功
print("head",head)
pattern_head1=re.compile("^money")  #匹配以money開頭的字符
head1=pattern_head1.findall(string)  #匹配失敗
print("head1",head1)
pattern_tail=re.compile("\*$")  #匹配結(jié)尾為*的字符
tail=pattern_tail.findall(string)  #匹配成功
print("tail",tail)
pattern_tail1=re.compile("money$")  #匹配結(jié)尾為money的字符
tail1=pattern_tail1.findall(string)  #匹配失敗
print("tail1",tail1)
pattern_limit=re.compile(r"\bhappy\b")  #匹配字符串中的單詞happy,如果happy左右兩側(cè)都是字母數(shù)字下劃線,注意前面需加r
limit=pattern_limit.findall(string)  #匹配成功,其中l(wèi)uckyhappy和happy_test不屬于匹配成功的對象
print("limit",limit)

結(jié)果

2.3.1 ^與\A,$與\Z

注意^和\A,$和\Z看似都匹配開頭和結(jié)尾,但在多行模式下存在差異,如下例子

import re
str = "Have a wonderful\nhope in python\nstudy"  #str內(nèi)容為3行,\n表示換行
# 使用^
print("^ in slnle line:",re.findall("^hope", str))  # 默認(rèn)單行模式,執(zhí)照字符串的行首匹配,找不到匹配項
print("^ in multiple line:",re.findall("^hope", str, re.MULTILINE))  # 在多行模式下找到匹配項,會匹配其他行的行首
# 使用\A
print("\A in slnle line:",re.findall("\Ahope", str))  # 默認(rèn)單行模式,執(zhí)照字符串的行首匹配,找不到匹配項
print("\A in multiple line:",re.findall("\Ahope", str, re.MULTILINE))  # 在多行模式下,依然不會匹配其他行的行首
# 使用$
print("$ in slnle line:",re.findall("python$", str))  # 默認(rèn)單行模式,執(zhí)照字符串的行首匹配,找不到匹配項
print("$ in multiple line:",re.findall("python$", str, re.MULTILINE))  # 在多行模式下找到匹配項,會匹配其他行的行首
# 使用\Z
print("\Z in slnle line:",re.findall("python\Z", str))  # 默認(rèn)單行模式,執(zhí)照字符串的行首匹配,找不到匹配項
print("\Z in multiple line:",re.findall("python\Z", str, re.MULTILINE))  # 在多行模式下,依然不會匹配其他行的行首

匹配結(jié)果

2.4 分組匹配

示例代碼

import re
str = "Zyp Have a 626 wonderful hello hope in python *** study"
pattern=re.compile("(Zyp).*([0-9]{3}).*(\*{3})")    #創(chuàng)建3個group查詢
result=pattern.match(str)
print("All content:",result.group(0))   #group[0]為原始字符串
print("Name:",result.group(1))     #查找的結(jié)果下標(biāo)從1開始
print("Value",result.group(2))
print("Count:",result.group(3))

結(jié)果

三、匹配函數(shù)

前面內(nèi)容已對匹配表達(dá)式進(jìn)行了介紹,下面將介紹一些常用的查找函數(shù),查找的條件也就是匹配表達(dá)式。主要有match,search,findall,finditer,sub,下表是它們之間的差異

3.1 compile

compile函數(shù)不是匹配函數(shù),主要是用于生成pattern對象,供匹配函數(shù)使用,好處是可以將該規(guī)則重復(fù)使用。

   語法: re.compile(pattern, flags=0)
            pattern : 匹配規(guī)則
            flags : 標(biāo)志位,默認(rèn)為0,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。

關(guān)于其中的flags,可配置如下值

  • re.I 忽略大小寫
  • re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境
  • re.M 多行模式
  • re.S 即為 . 并且包括換行符在內(nèi)的任意字符(. 不包括換行符)
  • re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫
  • re.X 為了增加可讀性,忽略空格和 # 后面的注釋

示例代碼

import re
str ="Zyp Have a 626 wonderful hello hope in python *** study"
str2="Hwq Have a 888 wonderful hello hope in python * study"
pattern=re.compile("(\w{3}).*([0-9]{3}).*(\*)")    #創(chuàng)建3個group查詢
result=pattern.match(str)
result2=pattern.match(str2)    #直接復(fù)用pattern,直接修改用于匹配的對象
print("Name:",result.group(1),result2.group(1))     #查找的結(jié)果下標(biāo)從1開始
print("Value",result.group(2),result2.group(2))
print("Count:",result.group(3),result2.group(3))

匹配結(jié)果

3.2 match

match需要注意的是匹配是從行首位置開始,如果行首位置不存在匹配的結(jié)果,縱使后面存在可匹配的字符,依舊搜索不到,并且如果行首匹配成功,則直接返回結(jié)果,只進(jìn)行一次匹配操作,不會繼續(xù)對后面的進(jìn)行匹配,

   語法: re.match(pattern, string, flags=0)
            pattern : 匹配規(guī)則
            string : 用于正則匹配的字符串。
            flags : 標(biāo)志位,默認(rèn)為0,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。

代碼示例

匹配結(jié)果,返回的結(jié)果為一個match對象

3.3 search

search作用與match類似,只進(jìn)行一次匹配,但不會限制于在行首位置匹配,可在任意位置進(jìn)行匹配,仍以match中的字符串示例

   語法: re.search(pattern, string, flags=0)
            pattern : 匹配規(guī)則
            string : 用于正則匹配的字符串。
            flags : 標(biāo)志位,默認(rèn)為0,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。

代碼示例

匹配結(jié)果,兩個字符串str,str1都匹配到了符合規(guī)則的結(jié)果,返回的結(jié)果為一個match對象

3.4 findall

findall從名稱可看出是查詢所有符合的匹配項,并且返回的結(jié)果類型為列表,仍以相同的例子為例,多加了一個1314

   語法: re.findall(pattern, string, flags=0)
            pattern : 匹配規(guī)則
            string : 用于正則匹配的字符串。
            flags : 標(biāo)志位,默認(rèn)為0,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。

示例代碼

匹配結(jié)果,兩個字符串的查詢結(jié)果一致

3.5 finditer

finditer作用與findall相同,也是查詢所有符合條件的結(jié)果,區(qū)別是返回的結(jié)果為迭代器,而不是列表。同時迭代表結(jié)果的查看可通過函數(shù)group或groups進(jìn)行查看,但groups查看結(jié)果,必須匹配規(guī)則pattern中設(shè)置了分組形式,否則查找的內(nèi)容為空元組。

   語法: re.finditer(pattern, string, flags=0)
            pattern : 匹配規(guī)則
            string : 用于正則匹配的字符串。
            flags : 標(biāo)志位,默認(rèn)為0,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。

示例代碼

匹配結(jié)果

3.6 sub

   語法: re.sub(pattern, repl, string, count=0, flags=0)
            pattern : 匹配規(guī)則
            repl : 用于替換匹配結(jié)果的新字符串。
            string : 用于正則匹配的字符串。
            count : 設(shè)置匹配后的替換次數(shù),默認(rèn) 0 表示替換所有的匹配結(jié)果。
            flags : 編譯時用的匹配模式。

代碼示例

import re
str ="Zyp Have a 626 wonderful hello hope 520 in python 1314*** study"  #str存在2個3位,1個4位的數(shù)字,
pattern=re.compile("[0-9]{3}")    #匹配一個3位的數(shù)字
result=re.sub(pattern,"999",str,count=2)   #對于查詢到的3位數(shù)字用999替換,只替換2次
print("result:",result)

替換結(jié)果,原先3位的數(shù)字前面2個都已替換位999,因只替換2次,第3個1314不進(jìn)行替換

四、常用場景

下面將針對一些常用的場景提供對應(yīng)的匹配規(guī)則

正則表達(dá)式	含義
[3]	匹配數(shù)字“3”,即指定匹配的具體數(shù)字
[c]	匹配字母“c”,即指定匹配的具體字符
[0-9]	匹配一個數(shù)字
[^0-9]	匹配一個除0-9外的字符
[a-z]	匹配一個小寫字母
[A-Z]	匹配一個大寫字母
[a-zA-Z]	匹配一個字母
[^a-z]	匹配一個非小寫字母的字符
^\d{4}-\d{1,2}-\d{1,2}	匹配以“-”形式分隔的日期,如2024-5-2
\d{18}|\d{17}[X]$	匹配出身份證號碼
\d+\.\d+\.\d+\.\d+	匹配IP地址
^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]*$	匹配電子郵箱

總結(jié) 

到此這篇關(guān)于Python正則匹配的文章就介紹到這了,更多相關(guān)Python正則匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python使用MongoDB運算符進(jìn)行數(shù)據(jù)查詢詳解

    Python使用MongoDB運算符進(jìn)行數(shù)據(jù)查詢詳解

    MongoDB 是一個非關(guān)系型數(shù)據(jù)庫,具有靈活的數(shù)據(jù)模型和豐富的查詢功能,本文將介紹在 Python 中使用 MongoDB 運算符進(jìn)行數(shù)據(jù)查詢的常用方法,需要的可以參考下
    2024-04-04
  • Python機器學(xué)習(xí)pytorch交叉熵?fù)p失函數(shù)的深刻理解

    Python機器學(xué)習(xí)pytorch交叉熵?fù)p失函數(shù)的深刻理解

    這篇文章主要為大家介紹了Python機器學(xué)習(xí)中對交叉熵?fù)p失函數(shù)的深刻理解,文中作出了詳細(xì)易懂的講解,有需要的朋友可以借鑒參考下希望能夠有所幫助
    2021-10-10
  • Python多線程與異步處理在HTTP請求中的應(yīng)用方式

    Python多線程與異步處理在HTTP請求中的應(yīng)用方式

    這篇文章主要介紹了Python多線程與異步處理在HTTP請求中的應(yīng)用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 詳解python中return和print的區(qū)別和用途

    詳解python中return和print的區(qū)別和用途

    在 Python 中,return 和 print 是兩種常見的語句,用于在函數(shù)中輸出信息或返回值,盡管它們看起來相似,但它們有不同的作用和用法,本文將詳細(xì)介紹 return 和 print 在函數(shù)中的區(qū)別,并提供豐富的示例代碼,以幫助你更好地理解它們的用途
    2023-11-11
  • 利用Python實現(xiàn)網(wǎng)絡(luò)測試的腳本分享

    利用Python實現(xiàn)網(wǎng)絡(luò)測試的腳本分享

    這篇文章主要給大家介紹了關(guān)于利用Python實現(xiàn)網(wǎng)絡(luò)測試的方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Python調(diào)用百度AI實現(xiàn)圖片上表格識別功能

    Python調(diào)用百度AI實現(xiàn)圖片上表格識別功能

    這篇文章主要給大家介紹了關(guān)于Python調(diào)用百度AI實現(xiàn)圖片上表格識別功能的相關(guān)資料,在Python環(huán)境下,利用百度AI開放平臺文字識別技術(shù),對表格類圖片進(jìn)行識別,需要的朋友可以參考下
    2021-09-09
  • Python?range函數(shù)生成一系列連續(xù)整數(shù)的內(nèi)部機制解析

    Python?range函數(shù)生成一系列連續(xù)整數(shù)的內(nèi)部機制解析

    這篇文章主要為大家介紹了Python?range函數(shù)生成一系列連續(xù)整數(shù)的內(nèi)部機制解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • python模塊引入問題和解決方案

    python模塊引入問題和解決方案

    本文主要介紹了python模塊引入問題和解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • python3中datetime庫,time庫以及pandas中的時間函數(shù)區(qū)別與詳解

    python3中datetime庫,time庫以及pandas中的時間函數(shù)區(qū)別與詳解

    這篇文章主要介紹了python3中datetime庫,time庫以及pandas中的時間函數(shù)區(qū)別與詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python 異常處理總結(jié)

    python 異常處理總結(jié)

    這篇文章主要介紹了python 異常的相關(guān)資料,并整理了相關(guān)異常資料,需要的朋友可以參考下
    2016-10-10

最新評論