Day17-總結(jié)

主要提供正則相關(guān)的方法

import re

1.什么是正則

'''
正則是字符串匹配的一種工具,擁有自己的語法。語法中主要包含各種符號的使用
'''

2.正則的語法

'''
re.fullmatch(正則表達(dá)式,字符串) - 檢查字符串是否完全符合正則表達(dá)式的規(guī)則(完全匹配)
匹配成功返回匹配對象,匹配失敗返回N
正則表達(dá)式 - Python中的正則表達(dá)式是寫在引號中(單雙引號),但是一般情況下會引號前加r
r'正則表達(dá)式'
'''
print('===========匹配符號==========')

1)普通字符 - 除了正則中有特殊功能或特殊意義以外的其他的所有字符

普通字符在正則中表示字符本身

表示一個字符串有三個字符,每個字符分別是abc

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

2) . - 匹配任意字符

'''
正則中出現(xiàn) . 的位置可以品牌任意字符
一個 . 只能匹配一個任意字符
'''

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

3)\w - 匹配字母、數(shù)字或者下劃線

'''
一個\w只能匹配一個字符(只針對ascii碼有效)
'''

re_str = r'a\w.c'
result = re.fullmatch(re_str, 'af3c')

4)\s - 匹配一個空白字符

'''
空白:空格、回車/換行、制表符
'''

result = re.fullmatch(r'aaa\sf2', 'aaa\nf2')
print(result)

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

6)\大寫字母 - 匹配非\小寫字母匹配的內(nèi)容

'''
\W - 匹配非數(shù)字、字母或者下劃線
\S - 匹配非空白字符
\D - 匹配非數(shù)字字符
'''

7)[] - 匹配字符集

'''
a.普通用法
[字符集] - 匹配字符集中的任意一個字符
[ad] - 匹配一個字符是a或者d
[\davc] - 匹配一個字符是數(shù)字或者a或者v或者c
b.表示范圍的字符集: [字符1-字符2] - 從字符1到字符2中的任意一個字符,注意字符2的編碼值必須是大于等于字符
[5-9]
[a-z]
[a-zA-Z] - 匹配任意一個字母
[a-zA-Z\d] - 匹配字母數(shù)字
c.反向選中:[^字符集] - 選中字符集中以外的其他的任意的一個字符
'''

result = re.fullmatch(r'[^abc]', '.')
print(result)

print('==========檢測符號==========')

一個匹配符號必須對應(yīng)一個具體的字符;檢測符號只是對符號所在的位置進(jìn)行檢查,不會影響字符串長度

1)\b - 檢測是否是單詞邊界

'''
單詞邊界:一切可以將兩個單詞區(qū)分開的符號都是單詞邊界,單詞開頭,單詞結(jié)尾,空白,標(biāo)點(diǎn)符號
'''

匹配一個字符串是'howare',然后檢測w的后面是否是單詞邊界

print(re.fullmatch(r'how\b are', 'how are'))

2) ^ - 檢測 ^ 所在的位置是否是字符串開頭

3)- 檢測所在的位置是否是字符串結(jié)尾

貪婪和非貪婪

'''
,+,?,{}對應(yīng)匹配次數(shù)是貪婪;在匹配次數(shù)不確定的時候才有貪婪與非貪婪的區(qū)分
在匹配次數(shù)不確定的符號后面加?,就會變成非貪婪:
?,+?,??,{M,N}?,
貪婪:在匹配成功的前提下盡可能多的匹配
非貪婪:在匹配成功的前提下盡可能少的匹配
'''

result = re.search(r'.+b', '1312abe121ab==')
print(result)
result = re.search(r'.+?b', '1312abe121ab')
print(result)

| 分支

'''
正則表達(dá)式1|正則表達(dá)式2
'''

() - 分組

'''
1)分組 - 將正則的中的一部分看成一個整體進(jìn)行操作
2)重復(fù) - 添加分組后可以在分組的后面通過\M來重復(fù)前面第M個分組匹配到的結(jié)果
'''

print(re.fullmatch(r'(\d+)aad\1', '223aad223'))

轉(zhuǎn)義符號 - 在正則符號前加\讓符號的功能消失

'''
正則中的轉(zhuǎn)義符號和字符串的轉(zhuǎn)義字符是兩回事
獨(dú)立的特殊符號放在[]中特殊意義會自動消失,但是' - ',' [] '
'''

print(re.fullmatch(r'\.ad', '.ad'))
import re

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

1.匹配次數(shù)

1) * - 匹配0次或多次

"""
字符* - *前的字符出現(xiàn)0次或者多次

r'a' - '','a','aa', 'aaa', 'aaaa',...
r'\d
' - '', '1', '34', '11892'
r'[abc]*' - '', 'a', 'ab', 'abbc', 'aaccbbb'
"""

print(re.fullmatch(r'a\d*b', 'a9888723b'))
print(re.fullmatch(r'a\d*b', 'ab'))

2) + - 匹配1次或多次

print(re.fullmatch(r'a\d+b', 'ab'))  # None
print(re.fullmatch(r'a\d+b', 'a8232323b'))

3) ? - 匹配0次或1次

print(re.fullmatch(r'[+-]?\d+', '-293'))

4) {}

"""
{N} - 匹配N次
{M,N} - 匹配M到N次
{M,} - 匹配至少M(fèi)次
{,N} - 最大匹配N次
"""

print(re.fullmatch(r'a{3}123', 'aaa123'))
print(re.fullmatch(r'a{2,5}123', 'aaa123'))
print(re.fullmatch(r'\d{3,}', '2238902324'))
print(re.fullmatch(r'\d{,3}', '219'))

練習(xí): 驗(yàn)證輸入用戶名和QQ號是否有效并給出對應(yīng)的提示信息

要求:

用戶名必須由字母、數(shù)字或下劃線構(gòu)成且長度在6~20個字符之間

QQ號是5~12的數(shù)字且首位不能為0

result = re.fullmatch(r'[\da-zA-Z_]{6,20}', 'huashd920')
if result:
    print('用戶名合法')
else:
    print('用戶名不合法')


result = re.fullmatch(r'[1-9]\d{4,11}', '43232333')
if result:
    print('QQ合法')
else:
    print('QQ不合法')

2.貪婪和非貪婪

"""
*,+,?,{}對應(yīng)匹配次數(shù)是貪婪; 在匹配次數(shù)不確定的時候才有貪婪和非貪婪的區(qū)分
在匹配次數(shù)不確定的符號后面加?,就會變成非貪婪: *?, +?, ??, {M,N}?, {M,}?, {,N}?

貪婪:在匹配成功的前提下,盡可能多的匹配
非貪婪: 在匹配成功的前提下,盡可能少的匹配
"""

result = re.search(r'.+b', '123aabcccaabdddb====')
print(result)    # 123aabcccaabdddb

result = re.search(r'.+?b', '123aabcccaabdddb====')
print(result)   # 123aab

result = re.search(r'a+?b', 'aab===')
print(result)

# 練習(xí): 獲取所有name對應(yīng)的值
with open('files/data', encoding='utf-8') as f:
    content = f.readline()
    names = re.findall(r'"name":"(.+?)"', content)
    print(len(names), names)

3. | - 分之

"""
正則表達(dá)式1|正則表達(dá)式2
"""

print(re.fullmatch(r'\d{3}|[a-zA-Z]{3}', 'asd'))

4. () - 分組

"""

  1. 分組 - 將正則中的一部分看成一個整體進(jìn)行操作
  2. 重復(fù) - 添加分組后,可以分組的后面通過\M來重復(fù)前面第M個分組匹配到的結(jié)果
    """

需求: 一個字符串最開頭是三個數(shù)字或者三個小寫字母,后面全是大寫字母

# 233KKSSK, abcJKJKJSKJDKJFKD
print(re.fullmatch(r'(\d{3}|[a-z]{3})[A-Z]+', 'ahsKLSA'))

# 23:45:67:78:67:89
print(re.fullmatch(r'(\d\d:)+\d\d', '34:54:34:67:90:12'))

# 23abc23, 100abc100, 39abc39  -> 匹配成功
# 23abc12  -> 匹配失敗
print(re.fullmatch(r'(\d+)abc\1', '100abc100'))
print(re.fullmatch(r'(\d+)([a-z]+)=\2([abc]{3})=\1{2}', '23ac=acaaa=2323'))

5. 轉(zhuǎn)義符號 - 在正則符號前加,讓符號的功能消失

"""
正則中的轉(zhuǎn)義符號和字符串的轉(zhuǎn)義字符是兩回事兒

獨(dú)立的特殊符號放在[]中特殊意義會自動消失, 但是-,[]...
"""

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

# 1+3
re_str = r'\d\+\d\\w'
print(re.fullmatch(re_str, '2+3\w'))


re_str = r'[.+*]abc[?]'   # .、+、*、?表示本身
print(re.fullmatch(re_str, '+abc?'))

# re_str = r'[a\-z]abc'
re_str = r'[az-]abc'
print(re.fullmatch(re_str, '-abc'))

re_str = r'[a\]^]abc'
print(re.fullmatch(re_str, ']abc'))

1.創(chuàng)建正則對象(了解)

"""
compile(正則表達(dá)式) - 根據(jù)正則表達(dá)式創(chuàng)建正則對象
"""

re_obj = compile(r'\d{3}')

print(fullmatch(r'\d{3}', '823'))
print(re_obj.fullmatch('234'))

2. 匹配

"""
fullmatch(正則表達(dá)式, 字符串) - 讓整個字符串和正則表達(dá)式進(jìn)行匹配
match(正則表達(dá)式, 字符串) - 匹配字符串開頭

返回值: 匹配成功是匹配結(jié)果對象,匹配失敗是None
"""

result = fullmatch(r'\d{3}[a-z]{4}', '234jkka')
print(result)

result = match(r'(\d{3})([a-z]{4})', '789hsjd三家分晉看jshjdh')
print(result)

匹配結(jié)果

1)匹配結(jié)果對應(yīng)的字符串

"""
匹配對象.group() - 獲取整個正則匹配到的結(jié)果
匹配對象.group(N) - 獲取第N個分組匹配到的結(jié)果
"""

print(result.group())
print(result.group(1))   # 取第一個分組的結(jié)果
print(result.group(2))      # 取第二個分組的結(jié)果

2)獲取匹配位置

"""
匹配對象.span(group=0)
匹配對象.start(group=0)
匹配對象.end(group=0)
"""

print(result.span(1))    # 取第一個分組匹配到的位置
print(result.start(1))
print(result.end(2))

3)獲取原字符串

print(result.string)

3.查找

"""
search(正則表達(dá)式,字符串) - 匹配出字符串中第一個滿足正則表達(dá)式的子串,結(jié)果是匹配對象

findall(正則表達(dá)式,字符串) - 獲取字符串中滿足正則表達(dá)式的所有的子串;結(jié)果是列表,列表中元素是字符串

finditer(正則表達(dá)式,字符串) - 獲取字符串中滿足正則表達(dá)式的所有的子串; 結(jié)果是迭代器,迭代器的元素是匹配對象
"""

result = search(r'\d{3}', 'how34,jks789lsoos009,.sdf9822')
print(result)

result = findall(r'\d{3}', 'how34,jks789lsoos009,.sdf9822')
print(result)    # ['789', '009', '982']

result = findall(r'(\d{3})', 'how34d,jks789asoos009,.sdf9822a==sd')
print(result)   # ['789', '822']

result = findall(r'(\d{3})([a-z]{2,})', 'how342ddfb,jks789aasoos009,.sdf9822ad==sd')
print(result)   # [('342', 'ddfb'), ('789', 'aasoos'), ('822', 'ad')]


result = finditer(r'(\d{3})([a-z]{2,})', 'how342ddfb,jks789aasoos009,.sdf9822ad==sd')
print(result)
print(next(result))

4.切割

"""
split(正則表達(dá)式, 字符串) - 按照滿足正則表達(dá)式的子串對字符串進(jìn)行切割。返回列表
"""

str1 = 'aaa9bbb0ccc90ddd87eee123fff'
# print(str1.split('9'))
print(split(r'\d+', str1))

5.替換

"""
sub(正則表達(dá)式, 字符串1, 字符串2, 替換次數(shù)=0) - 將字符串2中滿足正則表達(dá)式的子串替換成字符串1
替換次數(shù)是0的時候全部替換
"""

str1 = 'aaa9bbb0ccc90ddd87eee123fff'
new_str = sub(r'\d+', '+', str1)
print(new_str)    # aaa+bbb+ccc+ddd+eee+fff

new_str = sub(r'\d+', '+', str1, 2)
print(new_str)   # aaa+bbb+ccc90ddd87eee123fff


result = search(r'abc', 'hAbCjsfabckjks', flags=IGNORECASE)
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)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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