本文介绍: 正则表达式是指专门用于描述或刻画字符串内在规律的表达式

定义

正则表达式是指专门用于描述或刻画字符串内在规律的表达式

使用场景

无法通过切片,将字符串子串返回
借助replace方法,无法完成固定值或非固定位置值的替换
借助split方法,无法按照多种值实现字符串分割

findall(pattern, string, flags=0)

pattern指定需要匹配正则表达式
string指定处理字符串
flags指定匹配模式常用的值可以re.I、re.M、re.S和re.X。re.I的模式是让正则表达式大小写敏感re.M的模式是让正则表达式可以多行匹配re.S的模式指明正则符号即可以匹配任意字符,包括换行符nre.X模式允许正则表达式可以写得更加详细,如多行表示忽略空白字符加入注释等。

替换

sub(pattern, repl, string, count=0, flags=0)

pattern:同findall函数中的pattern
repl:指定替换成的新值。
string:同findall函数中的string
count用于指定最多替换次数默认为全部替换
flags:同findall函数中的flags

分割

split(pattern, string, maxsplit=0, flags=0)

pattern:同findall函数中pattern
maxsplit:用于指定最大分割次数默认为全部分割。
string:同findall函数中string
flags:同findall函数中flags

常用正则表达符号

使用这些函数,需要导入re功能

查原字符

指代直接存在字符串内部子串

# 导入第三方
import re
# 提取出字符串中的Python子串
s1 = '看了博主的Python文章,感觉Python简单学会了!'
out1 = re.findall('Python', s1)
print(out1)

输出

[‘Python’, ‘Python’]

英文状态的句号点 .

英文的:‘.’ 指代任意字符(如数字字母、标点符号、汉字等),但除了换行符n

# 导入第三方
import re
# 提取出动力的值
s2 = '此次宝马主要搭载了1.5L和1.5T两种动力的发动机。凯迪拉克则搭载了1.0T和1.8T的动力。'
out2 = re.findall('1...',s2)
out3 = re.findall('1...',s2) # . 代表小数点(转义一下)
print(out2)
print(out3)

[‘1.5L’, ‘1.5T’, ‘1.0T’, ‘1.8T’]
[‘1.5L’, ‘1.5T’, ‘1.0T’, ‘1.8T’]

斜杠

斜杠 表示转义符,用于转换含义的符号。
n指代换行
t:指代Tab制表符
d指代0~9中的任一数字
s:指代任意一种空白(如空格、Tab换行等);
w:指代字母数字下划线中的任意一种;(52:大小字 + 10:数字0-9 + 1下划线 = 63种)
. :指代句号点本身;
若是想打 则用\

# 导入第三方
import re
# 剔除字符串中的所有空白
s3 = ('距离2019北京马拉松开跑只有两周时间了,n今年的北京马拉松预报名人数超过16万人,t 媒体公布的中签率只有16%左右,再创历年来的新低。n')
print(s3)
out4 = re.sub('s','',s3)
print(out4)

输出

距离2019北京马拉松开跑只有两周时间了,
今年的北京马拉松预报名人数超过16万人,(这有个tab长度媒体公布的中签率只有16%左右,再创历年来的新低。
(这有个空白行
距离2019北京马拉松开跑只有两周时间了,今年的北京马拉松预报名人数超过16万人,媒体公布的中签率只有16%左右,再创历年来的新低。

英文的[]

指代字符集合,当需要特定字符匹配时,可以选择中括号

# 导入第三方
import re
# 取出手机号信息
s4 = '用户联系方式:13612345566,用户编号为11011254321'
out5 = re.findall('1[356789]ddddddddd', s4) # 第二位为356789中的一个
print(out5)
# 提取出动力
s5 = '通过对比新朗逸1.5L和1.5T两种动力在1.5年行驶期后的数据发现1.5T的口碑相对较好!'
out6 = re.findall('1.5[a-zA-Z]',s5) # 取出a-z或A-Z
print(out6)
# 或
out7 = re.findall('1.5[TL]',s5) # 取出a-z或A-Z
print(out7)

输出

[‘13612345566’]
[‘1.5L’, ‘1.5T’, ‘1.5T’]
[‘1.5L’, ‘1.5T’, ‘1.5T’]

英文的()

指代特定内容截取(抠)。

# 导入第三方
import re
# 提取用户年龄
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))

输出

[‘1’, ‘3’, ‘1’, ‘2’, ‘5’, ‘0’]
[‘age:3’, ‘age:5’]
[‘3’, ‘5’]

英文的?

表示匹配前一个字符匹配,0次或1次。

# 超链接的匹配
URL1 = 'https://www.baidu.com/'
URL2 = 'http://www.gov.cn/'
pattern = 'https?://www..*?'

这样httpshttp都能匹配上了。

加号 +

表示匹配前一个字符匹配,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))
print(res)

输出

[‘亨氏奶粉’, ‘奶粉勺’, ‘幼儿奶粉量筒’]

英文状态的大括号 {}

表示匹配前一个字符特定的次数范围
{m}:匹配前一个字符m次;
{m,}:匹配前一个字符至少m次;
{m,n}:匹配前一个字符m~n次;
{,n} :匹配前一个字符之多n次;

# 手机号码的匹配
pattern = '1[356789]d{9}'
# 至少6个长度密码
pattern = 'w{6,}'
# 区号信息
pattern = '0d{2,3}'

案例

# 导入用于正则表达式的re模块
import re
# 取出字符中所有的天气状态
string1 = "{ymd:'2018-01-01',tianqi:'晴',aqiInfo:'轻度污染'},{ymd:'2018-01-02',tianqi:'阴~小雨',aqiInfo:'优'},{ymd:'2018-01-03',tianqi:'小雨~中雨',aqiInfo:'优'},{ymd:'2018-01-04',tianqi:'中雨~小雨',aqiInfo:'优'}"
print(re.findall("tianqi:'(.*?)'", string1)) # ?为了防止盲目匹配(非贪婪式)

输出

[‘晴’, ‘阴~小雨’, ‘小雨~中雨’, ‘中雨~小雨’]

# 导入用于正则表达式的re模块
import re
# 取出所有含O字母的单词
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*ow*',string2, flags = re.I)) # re.I大小写敏感
# 将标点符号、数字和字母删除
string3 = '据悉,这次发运的4台蒸汽冷凝罐属于国际热核聚变实验堆(ITER)项目的核二级压力设备,先后完成了压力试验、真空试验、氦气检漏试验、千斤顶试验、吊耳载荷试验、叠装试验等验收试验。'
print(re.sub('[,。、a-zA-Z0-9()]','',string3))

输出

[‘Together’, ‘discovered’, ‘only’, ‘to’, ‘competition’, ‘Our’, ‘celebration’, ‘of’]
据悉这次发运的台蒸汽冷凝罐属于国际热核聚变实验堆项目的核二级压力设备先后完成了压力试验真空试验氦气检漏试验千斤顶试验吊耳载荷试验叠装试验等验收试验

# 导入用于正则表达式的re模块
import re
# 将每一部分内容分割
string4 = '2室2厅 | 101.62平 | 低区/7层 | 朝南 n 上海未来 - 浦东 - 金杨 - 2005年建'
split = re.split('[-|n]', string4) # |转义下表示竖杠本身,split函数是用来分割
print(split)
split_strip = [i.strip() for i in split] # 循环列表去除前后空格
print(split_strip)

输出

[‘2室2厅 ‘, ’ 101.62平 ‘, ’ 低区/7层 ‘, ’ 朝南 ‘, ’ 上海未来 ‘, ’ 浦东 ‘, ’ 金杨 ‘, ’ 2005年建’]
[‘2室2厅’, ‘101.62平’, ‘低区/7层’, ‘朝南’, ‘上海未来’, ‘浦东’, ‘金杨’, ‘2005年建’]

原文地址:https://blog.csdn.net/Eric005/article/details/134725420

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_39288.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注