本文将介绍几个最常用的正则符号,以及正则表达式的应用场景。
如果说【数学表达式】刻画的是数字的内在规律,那么【正则表达式】则是用来刻画和描述字符串内在规律的表达式。记得刚接触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)