文章目錄
- 正規表達式
-
- 一、比對類符号
-
- 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