正则表达式
运用场景:用于对字符串的查找,替换,分割
常用的正则符号
- 原字符
指代直接存在于字符串内部的子串。
# 导入第三方包
import re
#提取出字符串中的Python子串
s1 = '通过几天Python的学习,感觉Pyhton很简单,非常容易上手!'
re.findall('Python',s1)
- 英文状态的句号点 " . "
指代任意字符(如数组,字母,标点符号,汉字等),但除了换行符\n。
#提取出动力总成的值
s2 = ’此次新朗逸主要搭载了1.5L和1.5T两种动力总成的发动机。别克英朗则搭载了1.0T和1.3T的动力总成。‘
re.findall('1...',s2)
re.findall('1\...',s2)
- 反斜杠 " \ "
表示转义符,用于转换含义的符号。
\n:指代换行
\t:指代Tab制表符
\d:指代0~9中的任一数字
\s:指代任意一种空白(如空格、Tab、换行等)
\w:指代字母、数字和下划线中的任意一种(字母52种,数字10种,下划线1种)
.:指代句号本身
#剔除字符串中的所有空白
s3 = ’距离2019北京马拉松开跑只有两周时间了,\n今年的北京马拉松预报名人数超过16万人,\t媒体公布的中签率只有16%左右,再创历年来的新低。\n'
print(s3)
re.sub('\s','',s3)
- 英文状态的中括号 “[ ]”
指代字符集合,当需要特定字符匹配时,可以选择中括号。
#取出手机号信息
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)
- 英文状态的圆括号 “ ( ) ”
指代待定内容的截取(抠)。
#提取出用户的年龄
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)) 拿出age:加上数字
print(re.findall('age:(\d)',s6)) 只拿出age后的数字
- 英文状态的问号 “ ? ”
表示匹配前一个字符0次或1次
#超链接的匹配
URL1 = 'https://www.baidu.com/'
URL2 = 'http://www.gov.cn/'
pattern = 'https?://www\..*?'
- 加号 “ + ”
表示匹配前一个字符1次及以上。
#邮箱地址的匹配
email1 = 'Lsxxx2011@163.com'
email2 = '654088115@qq.com'
pattern = '[0-9a-zA-Z_\.\-]+@[a-zA-Z0-9_\-]+\.com'
- 星号 “ * ”
表示匹配前一个字符0次及以上。
#提取出产品名称中含有奶粉字样的产品
prod = ['婴儿袜','亨氏奶粉','奶粉勺','多功能奶瓶','幼儿奶粉量筒','磨牙棒']
res = []
for i in prod:
res.extend(re.findall('.*奶粉.*',i))
- 英文状态的大括号 “ { } ”
表示匹配前一个字符特定的次数或范围。
{m}:匹配前一个字符m次
{m,}:匹配前一个字符至少m次
{m,n}:匹配前一个字符m~n次
{,n}:匹配前一个字符至多n次