本文將介紹幾個最常用的正則符號,以及正則表達式的應用場景。
如果說【數學表達式】刻畫的是數字的內在規律,那么【正則表達式】則是用來刻畫和描述字符串內在規律的表達式。記得剛接觸python時學習過slice,replace,split等方法,但是一旦遇到復雜的情況這些工具就不能使用了。這個時候【正則表達式】就派上了用場。
使用正則表達式需要導入【re模塊包】
import re
主要有三種使用場景
場景1:無法通過切片將字符串的子串返回 findall函數
#語法
findall(pattern,string,flags=0)
pattern:指定需要匹配的正則表達式
string:指定待處理的字符串
flags:指定匹配模式,常用的值可以是re.I,re.M,re.S,re.X
re.I模式是讓正則表達式對大小寫不敏感
re.M模式是讓正則表達式可以多行匹配
re.S模式是指正則符號可以匹配任意字符,包括換行符\n
re.X模式允許正則表達式可以寫得更加詳細,如多行表示,忽略空白字符,加入注釋等
場景2:借助replace無法完成非固定值或非固定位置值的替換 sub函數
#語法
sub(pattern,repl,string,count=0,flags=0)
pattern:指定需要匹配的正則表達式
repl:指定替換成的新值
string:指定待處理的字符串
count:用于指定最多替換的次數,默認0為全部替換
flags:同findall函數中的flags
場景3:借助于split方法無法按照多種值實現字符串的分割 re.split函數
#語法
split(pattern,string,maxsplit=0,flags=0)
pattern:指定需要匹配的正則表達式
string:指定待處理的字符串
maxsplit:用于指定最大分割次數,默認0為全部分割
flags:同findall中的flags
常用的正則符號(注意組合使用)原字符
2. 英文狀態的句號點 .
3. 反斜杠 \
4. 英文狀態的中括號[]
5. 英文狀態的圓括號()
6. 英文狀態的問號?
7. 加號+
8. 星號 *
9. 英文狀態的大括號{}
下面一一舉例介紹:原字符
指代直接存在于字符串內部的子串
#導入第三方模塊包
import re
#提取字符串中的子串
s1='python是一門計算機程序語言,python語言具有簡潔性、易讀性等特點'
re.findall('python',s1)
2. 英文狀態的句點號 .
指代任意字符(如數字、字母、標點符號、漢字等),但除了換行符\n
#提取出動力總成的值
s2='此次新朗逸主要搭載了1.5L和1.5T兩種動力總成的發動機。別克英朗則搭載了1.0T和1.3T的動力總成。'
#寫法1
re.findall('1...',s2)
#寫法2用到轉義字符\
re.findall('1\...',s2)
3. 反斜杠 \
\n 換行
\t Tab制表符
\d 0-9中的任一數字
\s 任意一種空白(如空格、Tab、換行等)
\w 字母、數字、下劃線中的任意一種(63種:52種字母大小寫,數字0-9共10種,_1種)
\. 句號點本身
\\ \本身
#剔除字符串中的所有空白
s3=' 距離2019北京馬拉松開跑只有兩周時間了,\n今年的北京馬拉松預報名人數超過16萬人,\t媒體公布的
中簽率只有16%左右,再創歷年來的新低。\n'
print(s3)
re.sub('\s','',s3)
4. 英文狀態的中括號[]
指代字符集合,當需要特定字符匹配時,可以選擇中括號
#取出手機號信息
s4='用戶聯系方式:13612345566,用戶編號:11011254321'
re.findall('1[356789]\d\d\d\d\d\d\d\d\d',s4)
#提取出動力總成
s5='通過對比新朗逸1.5L和1.5T兩種動力在1.5年行使期后的數據。發現1.5T的口碑相對較好!'
re.findall('1.5[a-zA-Z]',s5)
re.findall('1.5[LT]',s5)
5. 英文狀態的圓括號()
指代特定內容的截取
#提取出用戶的年齡
s6='id:1,name:Tom,age:3,gender:1;id=2,name=Lily,age=5,gender=0'
print(re.findall('\d',s6))
print(re.findall('age:\d',s6))
print((re.findall('age:(\d)',s6)))
6.英文狀態的問號 ?
表示匹配前一個字符0次或1次
#超鏈接的匹配
URL1='https://www.baidu.com/'
URL2='http://www.gov.cn/'
pattern='https?://www\..*?\..*?/'
7. 加號+
表示匹配前一個字符一次及以上
#郵箱地址的匹配
email1='Lsxxx2011@163.com'
email2='654088115@qq.com'
pattern='[0-9a-zA-Z_\.\-]+@[0-9a-zA-Z_\-]+\.com'
8. 星號*
表示匹配前一個字符0次及以上
#提取出產品名稱中含有奶粉字樣的產品
prod=['嬰兒襪','亨氏奶粉','奶粉勺','多功能奶瓶','幼兒奶粉量筒','磨牙棒']
res[]
for i in prod:
res.extend(re.findall('.*奶粉.*',i))
res
# extend()函數用于在列表末尾一次性追加另一個序列中的多個值
9. 英文狀態的大括號{}
表示匹配前一個字符特定的次數或范圍
{m} 匹配前一個字符m次
{m,} 匹配前一個字符至少m次
{m,n} 匹配前一個字符m~n次
{,n} 匹配前一個字符之多n次
#手機號碼的匹配
pattern='1[356789]\d{9}'
#至少6個長度的密碼
pattern='\w{6,}'
#區號信息
pattern='0\d{2,3}'
正則表達式的案例應用取出字符中所有的天氣狀態
import re
string = "{ymd:'2018-01-01',tianqi:'晴',aqilnfo='輕度污染'},
{ymd:'2018-01-02',tianqi:'陰~小雨',aqilnfo='優'},
{ymd:'2018-01-03',tianqi:'小雨~中雨',aqilnfo='優'},
{ymd:'2018-01-04',tianqi:'中雨~小雨',aqilnfo='優'}"
print(re.findall("tianqi:'(.*?)'",string))
#.*?組合 防止盲目匹配,非貪婪式搜索
2. 取出所有含O/o字母的單詞
import re
string2='Together,we discovered that a free market only thrives when there are rules to
ensure competition and fair play,Our celebration of initiative and enterprise.'
print(re.findall('\w*o\w*',string2,flags=re.I))
3. 將標點符號、數字和字母刪除
import re
string3='據悉,這次發運的4臺蒸汽冷凝罐屬于國際熱核聚變實驗堆 (ITER)項目的核二級壓力設備,先后完成
了壓力試驗,真空試驗、氦氣檢漏實驗,千斤頂試驗,吊耳荷載試驗,疊裝試驗等驗收試驗'
print(re.sub('[,。、a-zA-Z0-9()]',"",string))
4.將每一部分的內容分割開
import re
string4='2室2廳|101.62平|低區/7層|朝南\n 上海未來-浦東-金楊-2005年建'
split=re.split('[-\|\n]',string4) #|代表或,所以要用轉義字符\
print(split)
split_strip=[i.strip() for i in split]
print(split_strip)