天天看點

python基礎day-16:正規表達式正規表達式      

文章目錄

  • 正規表達式
    • 一、比對類符号
      • 1.1 什麼是正規表達式
      • 1.2 一般方法vs正則
      • 1.3 正則符号
        • 1.3.1 普通字元
        • 1.3.2 .
        • 1.3.3 \d
        • 1.3.4 \s
        • 1.3.5 \w
        • 1.3.6 \D、\S
        • 1.3.7 字元集 []
        • 1.3.8 減号符 -
        • 1.3.9 非 [^字元集]
        • 1.3.10 忽略大小寫 (?i)
    • 二、檢測類符号
      • 2.1 \b
      • 2.2 ^
      • 2.3 $
    • 三、比對次數
      • 3.1 +
      • 3.2 *
      • 3.3 ?
      • 3.4 {}
      • 3.5 貪婪、非貪婪
    • 四、分組、分支
      • 4.1 分組 ()
        • 4.1.1 整體操作
        • 4.1.2 整體重複\M
      • 4.2 分支 |
    • 五、轉義符号
      • 5.1 \
      • 5.2 []
    • 六、re子產品
      • 6.1 fullmatch(正規表達式,字元串)
      • 6.2 match(正規表達式,字元串)
      • 6.3 search(正規表達式,字元串)
      • 6.4 findall(正規表達式,字元串)
      • 6.5 split(正規表達式,字元串)
      • 6.6 sub(正規表達式,str1,str2)

正規表達式

一、比對類符号

一個符号對應一個字元

1.1 什麼是正規表達式

  • 一種處理字元串的工具
  • 按指定規則自動處理字元串
  • 在不同的程式設計語言中,正則的文法相同,但表示方式不同
    python     '正規表達式'
        js         /正規表達式/
               
  • re 子產品是python内置的專門提供處理正規表達式函數的
import re
           

1.2 一般方法vs正則

感受一下

tel = input('請輸入手機号:')

# 一般方法判斷輸入的tel是否是手機号
if len(tel) == 11:
    for x in tel:
        if not ('0' <= x <= '9'):
            print('不合法')
    else:
        pass
    # ...還有很多不寫了
else:
    print('不合法')

# 正則方法
result = re.fullmatch(r'1[3-9]\d{9}', tel)
print(result)
           

1.3 正則符号

1.3.1 普通字元

  • 普通字元在正規表達式中表示這個符号本身
  • fullmatch(正規表達式,字元串)
    • 判斷字元串是否符合指定規則
    • 如果不符合,傳回None

1.3.2 .

  • 比對一個任意字元
    'a.b' - 比對一個長度是3 的字元串,第一個字元是a,最後是b,中間随便一個字元
               
re_str = 'a.b'
result = re.fullmatch(re_str, 'a?b')
print(result)  # <re.Match object; span=(0, 3), match='a?b'>
result = re.fullmatch(re_str, 'a??b')
print(result)  # None
           

1.3.3 \d

  • 在正則這裡不是轉義,就是一個正則符号
  • 比對一個任意數字
re_str = 'a\db'
# 比對一個長度3 ,第一個字元a,最後一個字元b,中間一個任意數字字元
result = re.fullmatch(re_str, 'a0b')
print(result)  # <re.Match object; span=(0, 3), match='a0b'>

re_str = 'a\d\d\d\d\db'
# 比對一個長度5 ,第一個字元a,最後一個字元b,中間一個任意數字字元
result = re.fullmatch(re_str, 'a12345b')
print(result)  # <re.Match object; span=(0, 7), match='a12345b'>
           

1.3.4 \s

  • 比對一個空白字元
  • 空白字元:空格’ ‘、空行’\n’、制表’\t’
re_str = '\s\s\s'
result = re.fullmatch(re_str, '\n \t')
print(result)  # <re.Match object; span=(0, 3), match='\n \t'>
           

1.3.5 \w

  • 比對一個字母、數字或下劃線
  • 但且ASCII碼表以外的字元也都可以比對
re_str = '\d\w\d'
result = re.fullmatch(re_str, '1嘿2')
print(result)  # <re.Match object; span=(0, 3), match='1嘿2'>
result = re.fullmatch(re_str, '1+2')
print(result)  # None
           

1.3.6 \D、\S

  • 大寫字母和小寫字母反過來
  • \D 比對一個非數字字元
  • \S 比對一個非空白字元

1.3.7 字元集 []

  • 比對字元集中出現的任意一個字元
  • 一個[]比對一個字元
re_str = 'a[xy0]b'
# 長度3,第一個是a,最後是b,中間是x、y、0中的任意一個
result = re.fullmatch(re_str, 'axb')
print(result)  # <re.Match object; span=(0, 3), match='axb'>
           

1.3.8 減号符 -

  • 在[]中,-在兩個字元之間出現表示範圍
  • 若不在兩個字元之間,就表示’-'本身
  • 前面的字元的編碼值必須小于後面的編碼值
re_str = 'a[Z-a]b'
# 長度3,中間為編碼值在Z和a之間的任意一個字元
result = re.fullmatch(re_str, 'axb')
print(result)  # None
result = re.fullmatch(re_str, 'a_b')
print(result)  # <re.Match object; span=(0, 3), match='a_b'>
           
[1-9] - 一個數字位元組
	[a-z] - 一個小寫字母
	[A-Z] - 一個大寫字母
	[\u4e00-\u9fa5] - 一個中文字元
           

1.3.9 非 [^字元集]

  • 在[]裡
  • 比對一個不在字元集中的任意字元
  • 隻有放在最前面有效,放在其它地方都是’^'本身

1.3.10 忽略大小寫 (?i)

  • ‘(?i)正規表達式’,在正規表達式前面加上括号問号 i
  • 給re子產品中函數的flags指派為 I(大寫的i)

二、檢測類符号

  • 不影響字元串長度
  • 在比對成功後檢查符号所在位置是否正确

2.1 \b

  • 檢測是否是單詞邊界
  • 單詞邊界:可以将兩個單詞區分開來的字元
  • 如空白、标點符号、字元串開頭/結尾等
re_str = r'\ba[b-z]\b'
result = re.findall(re_str, 'dfas asdf fs4 asf az sdfe')
print(result)  # ['az']
           

2.2 ^

  • 檢測字元串開頭

2.3 $

  • 檢測是否是字元串結尾

三、比對次數

3.1 +

  • 至少1次
re_str = r'a+[b-z]'
result = re.findall(re_str, 'dfasaaaffs4asfazsdfe')
print(result)  # ['as', 'aaaf', 'as', 'az']
           

3.2 *

  • 至少0次

3.3 ?

  • 兩種情況
  • 0次或1次
# 字元串是否是合法的整數
re_str = '[-+]?[1-9]\d*'  # 但沒有0
           

3.4 {}

  • {N} 比對N次
  • {M,N} [M, N]次
  • {M,} 至少M次
  • {,N} 最多N次

3.5 貪婪、非貪婪

  • 在比對次數不确定時
  • 比對氛圍貪婪和非貪婪兩種
  • 預設貪婪
  • 貪婪:在能比對成功的情況下,取最多的那種情況
  • 非貪:在能比對成功的情況下,取最少的那種情況
  • 設定非貪婪,在不确定次數後面加**?**
  • 爬蟲一般非貪
貪婪     非貪婪
	———————————————
	+       +?
	*       *?
	?       ??
	{M,N}   {M,N}?
	{M,}    {M,}?
	{,N}    {,N}?
	———————————————
           
re_str = 'a.+b'
print(re.findall(re_str, 'azbzzbzzzbzzzzbzzzzz'))
# ['azbzzbzzzbzzzzb']

re_str = 'a.+?b'
print(re.findall(re_str, 'azbzzbzzzbzzzzbzzzzz'))
# ['azb']
           

四、分組、分支

  • 将正規表達式中的某部分用()看作一個整體
  • 然後進行整體操作

4.1 分組 ()

4.1.1 整體操作

re_str = '(\d{2}[a-z]{3})+'
result = re.fullmatch(re_str, '32sdf45zsd66sde21sdf')
print(result)  # <re.Match object; span=(0, 20), match='32sdf45zsd66sde21sdf'>
           

4.1.2 整體重複\M

  • 重複前面第M個分組比對到的内容
re_str = r'(\d{2})([a-z]{3})=\2\1'
result = re.fullmatch(re_str, '12abc=cba21')
print(result)  # None

re_str = r'(\d{2})([a-z]{3})=\2\1'
result = re.fullmatch(re_str, '12abc=abc12')
print(result)  # <re.Match object; span=(0, 11), match='12abc=abc12'>
           

4.2 分支 |

# 練習:比對:abc後面三個數字或三個大寫字母
re_str = 'abc(\d|[A-Z]){3}'
result = re.fullmatch(re_str, 'abc123')
print(result)  # <re.Match object; span=(0, 6), match='abc123'>

result = re.fullmatch(re_str, 'abcJKL')
print(result)  # <re.Match object; span=(0, 6), match='abcJKL'>
           

五、轉義符号

5.1 \

  • 在正則中有特殊意義的符号前加 \ 讓這個符号的功能消失,表示符号本身

5.2 []

  • 在[]中,除了-、^、\d之類
  • 其它符号都表示符号本身

六、re子產品

6.1 fullmatch(正規表達式,字元串)

  • 字元串和正規表達式是否完全比對
  • 比對傳回比對對象
  • 不比對傳回None

6.2 match(正規表達式,字元串)

  • 開頭比對

6.3 search(正規表達式,字元串)

  • 第一個滿足的子串

6.4 findall(正規表達式,字元串)

  • 所有滿足的子串
  • 傳回清單
  • 如果正規表達式有分組,隻傳回分組裡面的字元串
  • 多個分組,清單裡的每個元素是個元組

6.5 split(正規表達式,字元串)

  • 将滿足正規表達式的子串作為切割點

6.6 sub(正規表達式,str1,str2)

  • 替換
  • 将str2中滿足的子串替換為str1