目錄
手冊地址:
https://www.runoob.com/regexp/regexp-metachar.html
在線工具:
http://c.runoob.com/front-end/854
正則表達式
正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配(一個字符串是否與我們所設定這樣的字符序列相匹配)。
快速檢索文本,實現一些替換文本的操作
- 檢查一串數字是否電話號碼
- 檢測一個字符串是否是email
- 把一個文本里指定的單詞替換為另外一個單詞
注意:
能使用底層包里自帶的函數解決問題(string,strings,strcnov),首先使用庫函數,其次再選擇正則表達式(不好理解).
概括單字符集 匹配單字符

import re
# 概括單字符集
a = 'Python 11\t11Java&678p\nh\rp'
# \d 匹配任意數字,等價於 [0-9]。 \D 匹配任意非數字
# \w 匹配數字字母下划線 \W 匹配非數字字母下划線
# \s 匹配任意空白字符,等價於 [\t\n\r\f]。 \S 匹配任意非空字符
# . 匹配換行符之外\n的其它所有字符 - 匹配范圍 a-zA-Z0-9
r1 = re.findall('\d',a)
r2 = re.findall('[0-9]',a) #匹配任何數字。類似於 [0123456789]
w1 = re.findall('\D',a)
w2 = re.findall('[^0-9]',a) #匹配除了數字外的字符
print(r1) #['1', '1', '1', '1', '6', '7', '8']
print(r2) #['1', '1', '1', '1', '6', '7', '8']
print(w1) #['P', 'y', 't', 'h', 'o', 'n', ' ', '\t', 'J', 'a', 'v', 'a', '&', 'p', '\n', 'h', '\r', 'p']
print(w2) #['P', 'y', 't', 'h', 'o', 'n', ' ', '\t', 'J', 'a', 'v', 'a', '&', 'p', '\n', 'h', '\r', 'p']
x1 = re.findall('\w',a)
x2 = re.findall('[A-Za-z0-9_]',a) #匹配數字字母下划線
x3 = re.findall('\W',a) #非匹配數字字母下划線
x4 = re.findall('[^A-Za-z0-9_]',a)
print(x1) # ['P', 'y', 't', 'h', 'o', 'n', '1', '1', '1', '1', 'J', 'a', 'v', 'a', '6', '7', '8', 'p', 'h', 'p']
print(x2) # ['P', 'y', 't', 'h', 'o', 'n', '1', '1', '1', '1', 'J', 'a', 'v', 'a', '6', '7', '8', 'p', 'h', 'p']
print(x3) #[' ', '\t', '&', '\n', '\r']
print(x4) #[' ', '\t', '&', '\n', '\r']
y1 = re.findall('\s',a)
y2 = re.findall('\S',a)
print(y1) #[' ', '\t', '\n', '\r']
print(y2) #['P', 'y', 't', 'h', 'o', 'n', '1', '1', '1', '1', 'J', 'a', 'v', 'a', '&', '6', '7', '8', 'p', 'h', 'p']
匹配字符集
import re
a = 'c0c++7Java8c9Python6Javascript'
# 使用python的內置函數
print(a.find('Python')>-1) # 輸出 True 如果沒有匹配到返回-1,否則返回第一個匹配到的位置
print('Python' in a) # 輸出 True
# 使用正規表達式
r=re.findall('Python',a) #['Python']
print(r)
if len(r)>0:
print('ok')
else:
print('no')
# 輸出:
# True
# True
# ['Python']
# ok
普通字符與元字符
- 普通字符 'Python'
- 元字符
\d
正則表達式 - 元字符
下表包含了元字符的完整列表以及它們在正則表達式上下文中的行為:
https://www.runoob.com/regexp/regexp-metachar.html
元字符和普通的字符的混用
a = 'abc , acc , adc , aec , afc , ahc'
- 匹配字符串中間是cf的
- 匹配字符串中間 不是cf的
- 匹配字符串中間字母 是c-f的
- 普通字符(方括號兩邊的)a和c是用來定界的,方括號里面的cf元字符是用來匹配的規則,cf是c或f的關系
import re
# 匹配字符串中間是cf的
a = 'abc , acc , adc , aec , afc , ahc'
r = re.findall('a[cf]c',a) #普通字符a和c是用來定界的,cf元字符是用來匹配的
print(r) #['acc', 'afc']
# 匹配字符串中間 不是cf的
r2 = re.findall('a[^cf]c',a)
print(r2) #['abc', 'adc', 'aec', 'ahc']
# 匹配字符串中間字母 是c-f的
r3 = re.findall('a[c-f]c',a)
print(r3) #['acc', 'adc', 'aec', 'afc']
數量詞{整數|*|+|?} 匹配多少次
| 符號 | 含義 |
|---|---|
| 整數 | 匹配指定長度的字母 |
| * | 匹配0次或者無限多次 |
| + | 匹配1次或者無限多次 |
| ? | 匹配0次或者1次 可以用來過濾單詞后面不要的字母,去重 |

-
{整數} 匹配指定長度的字母
import re # 匹配指定長度的字母 a = 'Python 111\t11Java&678php66javascript\nh\rp' r1 =re.findall('[A-Za-z]{3}',a) # 每次匹配3個長度的字母 print(r1) #['Pyt', 'hon', 'Jav', 'php', 'jav', 'asc', 'rip'] -
{*} 匹配0次或者無限多次
-
{+} 匹配1次或者無限多次
-
{?} 匹配0次或者1次 可以用來過濾單詞后面不要的字母,去重
import re # 數量詞 a = 'pytho0python1pythonn2' # * 匹配0次或者無限多次 r1 = re.findall('python*',a) print(r1) # 輸出 ['pytho', 'python', 'pythonn'] # + 匹配1次或者無限多次 r2 = re.findall('python+',a) print(r2) # 輸出 ['python', 'pythonn'] # ? 匹配0次或者1次 r3 = re.findall('python?',a) print(r3) # 輸出 ['pytho', 'python', 'python']
[0-9]?\.[0-9]+ 小數點前匹配0到1次,\是轉義小數點,小數點后匹配1次或者無限多次

?在非貪婪模式和數量詞使用時是不同的意義
- ?在
非貪婪模里是用來轉換貪婪與非貪婪模式的 - ?在
數量詞里是表示匹配0次或者1次
a = 'pytho0python1pythonn2'
# ? 在數量詞中 匹配0次或者1次
r1 = re.findall('python?',a)
print(r1) # 輸出 ['pytho', 'python', 'python']
# ?在`非貪婪模`里
r2 = re.findall('python{1,2}?',a)
print(r2) #['python', 'python']
# `貪婪模`
r2 = re.findall('python{1,2}',a)
print(r2) #['python', 'pythonn']
貪婪模式 匹配指定長度的字符串
import re
# 貪婪模式
a = 'Python 111\t11Java&678php66javascript\nh\rp'
# \d 匹配任意數字,等價於 [0-9]。 \D 匹配任意非數字
# \w 匹配數字字母下划線 \W 匹配非數字字母下划線
# \s 匹配任意空白字符,等價於 [\t\n\r\f]。 \S 匹配任意非空字符
r1 =re.findall('[A-Za-z]{3,10}',a) #貪婪模式 每次匹配3-10個長度的字母
r2 =re.findall('[A-Za-z]{3,}',a) #貪婪模式 每次匹配3到任意個長度的字母
print(r1) #['Python', 'Java', 'php', 'javascript']
print(r1) #['Python', 'Java', 'php', 'javascript']
非貪婪模式 匹配指定長度的字符串
花括號后加上?號表示非貪婪模式
import re
# 非貪婪模式
a = 'Python 111\t11Java&678php66javascript\nh\rp'
# \d 匹配任意數字,等價於 [0-9]。 \D 匹配任意非數字
# \w 匹配數字字母下划線 \W 匹配非數字字母下划線
# \s 匹配任意空白字符,等價於 [\t\n\r\f]。 \S 匹配任意非空字符
r1 =re.findall('[A-Za-z]{3,10}?',a) # ?非貪婪模式 每次匹配3個長度的字母
r2 =re.findall('[A-Za-z]{3,}?',a) # ?非貪婪模式 每次匹配3任意個長度的字母
print(r1) #['Pyt', 'hon', 'Jav', 'php', 'jav', 'asc', 'rip']
print(r1) #['Pyt', 'hon', 'Jav', 'php', 'jav', 'asc', 'rip']
邊界匹配
- ^ 邊界的開始
- $ 邊界的結束
# 邊界匹配
import re
qq = '100000001'
# 4~8
# ^邊界的開始 $邊界的結束
r = re.findall('^\d{4,8}$',qq)
print(r) #打印 []
r1 = re.findall('^000',qq)
print(r1) #打印 [] qq不是以0開頭的,匹配不到
r2 = re.findall('000$',qq) #qq不是以0結束的,匹配不到
print(r2) #打印 []
組的概念

import re
a = 'PythonPythonPythonPythonPython'
# a里是否有三個Python
##方法一
r = re.findall('PythonPythonPython',a)
print(r) #打印 ['PythonPythonPython']
##方法二
r2 = re.findall('(Python){3}',a) #括號表示組,是並且的關系,匹配時可以有多個組如,'(Python){3}(js)',
print(r2) #打印 ['Python']
##方法三
r3 = re.findall('Python{3}',a) #這種字法只能匹配單個字符(如:a) 不能匹配字符集(如單詞:Python)
print(r3) #打印 []
參數匹配
第三個參數,|表示多種模式疊加
.點匹配換行符之外\n的其它所有字符- re.I 不區分大小寫
- re.S 表示可以讓
.點號匹配包括\n在內的所有字符
import re
a = 'PythonC#\nJavaPHP'
# 匹配出C#\n
r = re.findall('c#.',a)
print(r) #打印 []
r1 = re.findall('c#.', a , re.I)
print(r1) #打印 []
# .匹配換行符之外\n的其它所有字符
# re.I 不區分大小寫
# re.S 表示.號匹配包括\n在內的所有字符
r1 = re.findall('c#.', a , re.I | re.S)
print(r1) #打印 ['C#\n']
替換
- 方法一:內置replace函數
- 方法二:正則普通替換
- 方法三:正則用函數替換
import re
a = 'PythonC#JavaC#PHPC#'
#替換C#為GO
##方法一:內置replace函數
#字符串是不能改變的,所以要重新給變量賦值
a1 = a.replace('C#','GO',2) #參數 老的 新的 替換的次數
print(a1) #輸出 PythonGOJavaGOPHPC#
##方法二:正則普通替換
a2 = re.sub('C#','GO',a,1) #參數(匹配的規則)老的 新的 原字符串 替換的次數
print(a2) #輸出 PythonGOJavaC#PHPC#
##方法三:正則用函數替換
def couvert(value):
print(value)
# 輸出 匹配到了三次,所以輸出三次
# <re.Match object; span=(6, 8), match='C#'>
# <re.Match object; span=(12, 14), match='C#'>
# <re.Match object; span=(17, 19), match='C#'>
# 每次匹配時拿到match里的值
matched = value.group()
return '!!' + matched + '!!' # 返回每次處理后的match里的值
a3 = re.sub('C#',couvert,a,3)
print(a3) #輸出 Python!!C#!!Java!!C#!!PHP!!C#!!
