day18 正則

1.什么是正則表達式

正則表達式是字符串匹配工具,是為了在某些需求下可以更方便、更快捷的處理字符串

2.怎么使用正則處理字符串

python通過提供re模塊來支持正則表達式

re.fullmatch(正則表達式,字符串) - 讓正則表達式和字符串進行完全匹配,返回匹配結(jié)果,如果匹配不成功返回None

3.怎么寫正規(guī)表達式

python中正則表達式是放在字符串中,并且這個字符串一般會在最前面加r/R。

r'正則'

4.正則語法

普通字符 - 代表字符本身

re_str = r'a'
result = re.fullmatch(re_str,'a')
print(result)

. - 匹配任意一個字符
一個 . 代表一個字符,匹配是任意字符

re_str = r'.abc'
result = re.fullmatch(re_str,'1abc')
print(result)

\w - 匹配一個ASCII表中的字母,數(shù)字,下劃線。還可以匹配非ASCII碼表字符

re_str = r'.\w'
result = re.fullmatch(re_str,'s_')
print(result)

\s - 匹配一個空白字符

空白字符包括:空格,回車,制表符

re_str = r'\s\sa'
result = re.fullmatch(re_str,'\n\ta')
print(result)

\d - 匹配一個數(shù)字字符

re_str = r'年齡:\d\d'
result = re.fullmatch(re_str,'年齡:12')
print(result)

\b - 檢測單詞邊界(檢測\b所在的位置是否是單詞邊界)

單詞邊界:所有能夠標(biāo)志一個單詞開始或者結(jié)束的符號。

^ - 檢測是否是字符串開頭

result = re.fullmatch(r'^\d\d','23')
print(result)

$ - 檢測是否是字符串結(jié)尾

result = re.fullmatch(r'\d\d$','89金額:23,100 年齡:81')
print(result)

\大寫字母 - 對‘\小寫字母’的否定

\W  -  匹配非數(shù)字、字母、下劃線
\S  -  匹配非空白字符
\D  -  匹配非數(shù)字字符
\B  -  檢測是否是非單詞邊界

[字符集] - 匹配 [] 中任意一個字符

a.
[普通字符集] - 匹配 [] 中任意一個字符

b.用 - 表示范圍
[字符1-字符2] - 匹配編碼值在字符1編碼到字符2編碼之間的任意一個字符  (ord(字符1) < ord(字符 2))
[0-9]  -  所有數(shù)字字符中的一個
[2-9]  -  所有'2'-'9'數(shù)字字符中的一個
[一-龥] - 所有中文字符中的一個

c.[]內(nèi)容中的最前面加^,表示否定 (只有放在[]里的最前面才有意義)
[^abc]   -  表示 除了'a''b''c'的任意一個字符
[^a-z]   -   表示 除了小寫字母的任意一個字符
# 匹配一個字符串長度為 4 ,后3位是‘123’,第一位是 ‘a(chǎn)’‘b’‘c’中任意一個
re_str = r'[abc]123'
result = re.fullmatch(re_str,'a123')
print(result)

轉(zhuǎn)義符號 - 將正則中有特殊意義或者特殊功能的符號 變成普通符號

a.在中括號外
在特殊符號前加'\'讓其特殊意義消失

b.在中括號內(nèi)
單獨的有特殊意義的符號,除了'^'在最前面,'-'在兩個字符之間,其他的都不需要轉(zhuǎn)義,特殊意義自動消失

================匹配次數(shù)==============

    • 匹配 0 次 或者 多次
r'a*bc' -  匹配一次字符串,'bc'前有0個或者多個a
r'\d*'  -   匹配一個字符串由 0 個或者多個任意數(shù)字字符組成

"""

re_str = r'a\d*b'
result = re.fullmatch(re_str,'a12b')
print(result)

# 練習(xí),寫一個正則表達式能夠匹配所有的小數(shù)
re_str = r'\d\d*\.\d\d*'
result = re.fullmatch(re_str,'5144.1233')
print(result
    • 匹配至少一次
re_str = r'\d+\.\d+'
result = re.fullmatch(re_str,'5144.1233')
print(result)

{}
"""
{N} - 匹配N次
{M,N} - 匹配 M 到 N 次
{M,} - 匹配至少M次
{,N} - 匹配最多N次
"""

re_str = r'\d{4}'
result = re.fullmatch(re_str,'2134')
print(result)

re_str = r'\d{2,5}'
result = re.fullmatch(re_str,'12')
print(result)

re_str = r'\d{4,}'
result = re.fullmatch(re_str,'2134')
print(result)

re_str = r'\d{,4}'
result = re.fullmatch(re_str,'')
print(result)

? - 匹配 0 次或 1 次

==============貪婪和非貪婪==============

匹配次數(shù)不明確時,盡可能多的匹配 為 貪婪匹配

非貪婪匹配 是在 次數(shù)不明確的符號后面加 ?

*?
+?
{M,N}?
{M,}?
{,N}?

===================分支/選擇=============

正則1 | 正則2 - 先用正則1去匹配,如果匹配成功就成功,匹配不成功再使用正則2去匹配

 要求用戶名全部都是數(shù)字或者字母,長度是6-12
re_str = r'\d{6,12}|[a-zA-Z]{6,12}'
result = re.fullmatch(re_str,'caqwqdqqfq')
print(result)

=================分組()==================
"""
a.將小括號中的內(nèi)容當(dāng)做一個整體來操作

b. \數(shù)字 - 重復(fù)第幾個分組匹配結(jié)果
"""

re_str = r'[a-zA-Z\d](a|b|c)'
result = re.fullmatch(re_str,'2c')
print(result)

re_str = r'(a|b|c)(a|b|c)\2(a|b|c)'
result = re.fullmatch(re_str,'abbb')
print(result)

完全匹配 - 讓字符串長度,字符的值和正則表達式完全匹配
"""
re.fullmatch(正則表達式,字符串) - 匹配成功返回匹配對象,匹配失敗返回None

當(dāng)需要對整個字符串進行條件判斷的時候使用:
"""

result = re.fullmatch(r'(\d{3})=([a-z]{3})','234=haj')
print(result)   #<_sre.SRE_Match object; span=(0, 7), match='234=haj'>

span 匹配到的內(nèi)容在源字符串中的位置

print(result.span())  # (0, 7)
print(result.span(1))  # (0, 3)    正則表達式中第一個分組匹配結(jié)果的范圍
print(result.span(2))  # (4, 7)    正則表達式中第二個分組匹配結(jié)果的范圍

print(result.start(2),result.end(2))  # 4 7

獲取匹配到的值

print(result.group())    # 整個正則表達式的匹配結(jié)果
print(result.group(1))   #  第一個分組的匹配結(jié)果
print(result.group(2))   #  第二個分組的匹配結(jié)果

獲取原字符串`

print(result.string)

匹配字符串開頭
"""
re.match(正則表達式,字符串) - 判斷字符串的開頭是否和正則表達式相匹配,匹配成功返回匹配對象,失敗返回None

只檢測字符串開頭是否滿足要求
"""

result = re.match(r'\d{3}','123aaaaa')
print(result)

search

"""
re.search(正則表達式,字符串) - 在字符串中查找是否有和正則表達式匹配的字串,如果沒有返回None
如果有就返回第一個匹配結(jié)果
"""

result = re.search(r'(\d{3})=([a-z]{3})','how 231=aasdd3232=12121===')
print(result,result.span(),result.group())

findall

"""
re.findall(正則表達式,字符串) - 獲取字符串中所有滿足正則表達式的字串,以列表的形式返回

注意: 正則表達式中含有分組,如果只有一個分組,列表元素就是分組匹配到的內(nèi)容
如果有多個分組,列表的元素 就是每個分組匹配的結(jié)果以元祖形式呈現(xiàn)
"""

result = re.findall(r'\d+','au asdai2nbiu23b3ibi 8abaib9')
print(result)

finditer

"""
re.finditer(正則表達式,字符串) - 獲取字符串中所有能夠和正則表達式匹配的子串的匹配結(jié)果。
返回值是一個迭代器,迭代器中的元素是匹配結(jié)果
"""

result = re.finditer(r'abc(\d|[A-Z]{2})','abc2-abcHD===')
print(result)

for item in result:
    print(item.group(),item.span())
    print(item.group(1))


result = re.findall(r'\d+\.\d+|\d+','are 89he ks90.2 ans78oo1.23h!w9end9009ooo')
print(result)          # r'\d+\.?\d*'
sum = 0
for item in result:
    sum += float(item)
print(sum)

split

"""
re.split(正則表達式,字符串) - 將字符串按照滿足正則表達式的子串進行切割
"""

result = re.split(r'[=/-]','aaa=ddd-aaw/w22')
print(result)

sub

"""
re.sub(正則表達式,新字符串,字符串,替換次數(shù)) - 將字符串中滿足正則表達式的子串替換成新字符串

替換次數(shù)可以不復(fù)制,表示全部替換
"""

result = re.sub(r'\d','=','aoh2iho23oh441nb23h1h3')
print(result)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一.復(fù)習(xí)json 1.文件操作打開文件、文件讀寫、關(guān)閉文件 文件對象 = open(文件路徑, 打開方式,enco...
    程序里的小仙女閱讀 594評論 0 0
  • 01 """正則表達式是用匹配或者描述字符串的工具。 用處:a.判斷字符串是否滿足某個條件---判斷輸入的字符串是...
    我才是鱷魚寶寶閱讀 413評論 0 0
  • 1.什么是正則表達式 正則表達式是字符串匹配工具,它是為了在某些需求下可以更方便、更快速的處理字符串 2.怎么使用...
    zlyyL閱讀 438評論 0 0
  • 一、正則表達式語法 正則表達式是用匹配或者描述字符串的工具。 用處:a.判斷字符串是否滿足某個條件---判斷輸入的...
    魅影_0d2e閱讀 621評論 0 0
  • 一、正則表達式語法 正則表達式是用來匹配或者描述字符串的工具。 用處:a.判斷字符串是否滿足某個條件 --> 判斷...
    xdxh閱讀 654評論 0 0

友情鏈接更多精彩內(nèi)容