Python 自 1.5 版本起增加了re 模塊,它提供 Perl 風格的正則表達式模式。re 模塊使 Python 語言擁有全部的正則表達式功能。
入門
實例:找出字符串中的所有小寫字母。
import re
# 設定一個常量
a = '兩點水|twowater|liangdianshui|草根程序員|ReadingWithU'
# 選擇 a 裏面的所有小寫英文字母
re_findall = re.findall('[a-z]', a)
print(re_findall)
結果:
['t', 'w', 'o', 'w', 'a', 't', 'e', 'r', 'l', 'i', 'a', 'n', 'g', 'd', 'i', 'a', 'n', 's', 'h', 'u', 'i', 'e', 'a', 'd', 'i', 'n', 'g', 'i', 't', 'h']
字符集
字符集是由一對方括號 “[]” 括起來的字符集合。使用字符集,可以匹配多個字符中的一個。比如:[0-9a-fA-F] ,匹配單個的十六進制數字,且不分大小寫。注意了,字符和範圍定義的先後順序對匹配的結果是沒有任何影響的。
字符集一對方括號 “[]” 裏面的字符關係是"或(OR)"關係。
import re
a = 'uav,ubv,ucv,uwv,uzv,ucv,uov'
# 字符集
# 取 u 和 v 中間是 a 或 b 或 c 的字符
findall = re.findall('u[abc]v', a)
print(findall)
# 如果是連續的字母,數字可以使用 - 來代替
l = re.findall('u[a-c]v', a)
print(l)
# 取 u 和 v 中間不是 a 或 b 或 c 的字符
re_findall = re.findall('u[^abc]v', a)
print(re_findall)
結果:
['uav', 'ubv', 'ucv', 'ucv']
['uav', 'ubv', 'ucv', 'ucv']
['uwv', 'uzv', 'uov']
數量詞
數量詞的詞法是:{min,max} 。min 和 max 都是非負整數。如果逗號有而 max 被忽略了,則 max 沒有限制。如果逗號和 max 都被忽略了,則重複 min 次。
實例:匹配出字符串中 4 到 7 個字母的英文
import re
a = 'java*&39android##@@python'
# 數量詞
findall = re.findall('[a-z]{4,7}', a)
print(findall)
結果:
['java', 'android', 'python']
re.sub
我們很多時候需要替換字符串中的字符,這時候就可以用到 def sub(pattern, repl, string, count=0, flags=0) 函數了,re.sub 共有五個參數。其中三個必選參數:pattern, repl, string ; 兩個可選參數:count, flags .
參數意義:
- pattern
表示正則中的模式字符串 - repl
repl,就是replacement,被替換的字符串的意思 - string
即表示要被處理,要被替換的那個 string 字符串 - count
對於pattern中匹配到的結果,count可以控制對前幾個group進行替換 - flags
正則表達式修飾符
實例
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import re
a = 'Python*Android*Java-888'
# 把字符串中的 * 字符替換成 & 字符
sub1 = re.sub('\*', '&', a)
print(sub1)
# 把字符串中的第一個 * 字符替換成 & 字符
sub2 = re.sub('\*', '&', a, 1)
print(sub2)
# 把字符串中的 * 字符替換成 & 字符,把字符 - 換成 |
# 1、先定義一個函數
def convert(value):
group = value.group()
if (group == '*'):
return '&'
elif (group == '-'):
return '|'
# 第二個參數,要替換的字符可以爲一個函數
sub3 = re.sub('[\*-]', convert, a)
print(sub3)
輸出的結果:
Python&Android&Java-888
Python&Android*Java-888
Python&Android&Java|888
最後,附送一些常用的正則表達式:
史上最全常用正則表達式大全