Python正则表达式详解(含丰富案例)

前言:正则表达式在网络爬虫、数据分析中有着广泛使用,掌握正则表达式能够达到事半功倍的效果。本文详细介绍正则表达式中各种规则及其符号含义,并结合Python中的Re库进行演示,由浅入深,即学即练即用,内容丰富,非常适合初学者。

正则表达式(regular expression)就是用一组由字母和符号组成的“表达式”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如表达式“xy+” 描述的特征是“一个 ‘x’ 和 至少一个 ‘y’ ”,那么‘xy’,‘xyy’, ‘xyyyyyyy’都符合这个特征。

正则表达式主要应用场景

  • 验证字符串是否符合指定特征,比如验证用户名或密码是否符合要求、是否是合法的邮件地址等;

  • 用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便;

  • 用来替换,比普通的替换更强大。

正则表达式的规则

(1)普通字符

字母、数字、汉字、下划线、以及没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。

例1:表达式 “c”,在匹配字符串 “abcde” 时,匹配结果是:成功;匹配到的内容是:“c”;匹配到的位置是:开始于2,结束于3。(包含开始位置,不包含结束位置

例2:表达式 “bcd”,在匹配字符串"abcde"时,匹配结果是:成功;匹配到的内容是:“bcd”;匹配到的位置是:开始于1,结束于4。

(2)转义字符

  • 一些不便书写的字符,采用在前面加“\” 的方法。例如制表符、换行符等;

  • 一些有特殊用处的标点符号,在前面加“\” 后,代表该符号本身。例如{,}, [, ], /, \, +, *, ., $, ^, |, ? 等;

转义字符的匹配方法与“普通字符”类似,也是匹配与之相同的一个字符。

例如:表达式 “\ d " ,在匹配字符串 " a b c d",在匹配字符串 "abc d",在匹配字符串"abcde” 时,匹配结果是:成功;匹配到的内容是:“$d”;匹配到的位置是:开始于3,结束于5。

(3)能够与 ‘多种字符’ 匹配的表达式

正则表达式中的一些表示方法,可以匹配 ‘多种字符’ 中的任意一个字符。例如,表达式"\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。

例如:表达式 “\d\d”,在匹配 “abc123” 时,匹配的结果是:成功;匹配到的内容是:“12”;匹配到的位置是:开始于3,结束于5。

(4)自定义能够匹配 ‘多种字符’ 的表达式

使用方括号 [ ] 包含一系列字符,能匹配其中任意一个字符。用 [^ ] 包含一系列字符,则能匹配其中字符之外的任意一个字符。虽然可以匹配其中任意一个,但是只能是一个,不是多个。

例如:表达式 “[bcd][bcd]” 匹配 “abc123” 时,匹配的结果是:成功;匹配到的内容是:“bc”;匹配到的位置是:开始于1,结束于3。

(5)修饰匹配次数的特殊符号

例如:表达式 “\d+\.?\d*” 在匹配 “It costs $12.5” 时,匹配的结果是:成功;匹配到的内容是:“12.5”;匹配到的位置是:开始于10,结束于14。

(6)一些代表抽象意义的特殊符号

例1:表达式 “^aaa” 在匹配 “xxxaaaxxx” 时,匹配失败。因为 “^” 要求与字符串开始的地方匹配,只有当 “aaa” 位于字符串的开头的时候,“^aaa” 才能匹配,比如:“aaaxxxxxx”。

例2:**表达式 “aaa " 在匹配 " x x x a a a x x x " 时 ∗ ∗ ,匹配失败。因为 " "在匹配 "xxxaaaxxx" 时**,匹配失败。因为" "在匹配"xxxaaaxxx",匹配失败。因为"” 要求与字符串结束的地方匹配,只有当"aaa"位于字符串的结尾的时候,"aaa$"才能匹配,比如:“xxxxxxaaa”。

例3:表达式 "Tom|Jack"在匹配字符串 “I’mTom, he is Jack” 时,匹配结果是:成功;匹配到的内容是:“Tom”;匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:“Jack”;匹配到的位置时:开始于15,结束于19。

例4:表达式 "(go\s*)+"在匹配 "Let’sgo gogo!"时,匹配结果是:成功;匹配到内容是:“gogogo”;匹配到的位置是:开始于6,结束于14。

例5:表达式 "¥(\d+\.?\d*)"在匹配 "$10.9,¥20.5"时,匹配的结果是:成功;匹配到的内容是:“¥20.5”;匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:“20.5”。

思考题:写出满足下列要求的正则表达式

  • 仅含6位数字的字符串

  • 18位身份证号码(最后一位可能包含X)

  • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)

匹配次数中的贪婪与非贪婪

在使用修饰匹配次数的特殊符号时,如“?”,“*”, “+”等,可以使同一个表达式能够匹配不同的次数,具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配,这种匹配原则就叫作"贪婪" 模式 。例如,针对文本“dxxxdxxxd”,下列表达式匹配结果如下。

在修饰匹配次数的特殊符号后再加上一个"?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 “不匹配”。这种匹配原则叫作"非贪婪" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。例如,针对文本“dxxxdxxxd”,下列表达式匹配结果如下。

Python中的正则表达式库 - re

  • re库是Python的标准库,不需要额外安装,主要用于字符串匹配

  • 调用方式:import re

  • re 库采用raw string类型表示正则表达式,rawstring是不包含对转义符再次转义的字符串。例如:r’[1‐9]\d{5}’

  • re库也可以采用string类型表示正则表达式,但更繁琐,例如“‘[1‐9]\\d{5}’”

  • 当正则表达式包含转义符时,建议使用raw string

re库的主要功能函数

注意group()和groups()的区别**,一个是返回匹配的字符串**,一个是返回各部分匹配内容组成的元组。当表达式中没有圆括号时,groups()返回的是空元组,当存在圆括号时,有几个圆括号groups()返回的元组里就有几个元素。

正则表达式案例-验证用户名

编写程序实现下述功能,提示用户输入用户名,要求用户名以字母开头,长度不少于3位,只能包含字母、数字、下划线,如果用户输入符合要求,则提示注册成功,否则提示用户名不符合要求,请重新输入,一直循环直到用户名符合要求为止。程序执行效果如下图所示。

参考代码如下:

import re  # 导入正则表达式库
name = input("请输入用户名,以字母开头,长度不少于3位,只能包含字母、数字、下划线:")  # 提示用户输入
match = re.match(r"^[a-zA-Z]\w{2,}$", name)  # 验证输入是否符合要求
while match is None:  # 如果不符合要求,则循环
    print("用户名不符合要求,请重新输入:", end=" ")  # 提示用户名不符合要求
    name = input()  # 重新获取用户输入
    match = re.match(r"^[a-zA-Z]\w{2,}$", name)  # 验证输入是否符合要求
    print("恭喜你, {} ,注册成功!".format(name))  # 提示注册成功

正则表达式案例-编程语言排行

  • 数据来源:https://www.tiobe.com/tiobe-index/网页源代码,保存到”编程语言排行.txt”文件。

  • 部分内容截图如下,排行前十的编程语言数据存放在series属性里,每项编程语言包含名称(name)和数据(data)两部分内容,其中data部分包含该编程语言各个月份编程语言所占比例,。

import re  # 正则表达式
import csv  # csv文件操作
with open("编程语言排行.txt", mode="r", encoding="utf-8") as fp:  # 打开指定文件
    text = fp.read()  # 读取文件内容
content = " ".join(re.findall(r"series: (.*?)\}\);", text, re.DOTALL))  # 获取所有编程语言数据
total_content = re.findall(r"({.*?})", content, re.DOTALL)  # 获取各个编程语言的具体数据
with open("lang.csv", mode="w", encoding="utf-8", newline="") as fp:  # 对数据进行处理并保存到文件
    writer = csv.DictWriter(fp, ['name', 'value', 'date'])
    writer.writeheader()  # 写入标题
    for item in total_content:
        name = " ".join(re.findall(r"name : '(.*?)'", item, re.DOTALL))
        temp_datas = re.findall(r"\[Date.UTC(.*?)\]", item, re.DOTALL)  # 获取不同时间的热度信息
        for data in temp_datas:
            data = data.replace(" ", "").replace("(", "").replace(")", "")
            value = data.split(",")[-1]  # 热度值
            date = data.split(",")[:-1]  # 日期信息
            writer.writerow({"name": name, "value": value, "date": "{}-{:02d}-{:02d}".format(date[0], int(date[1]) + 1, int(date[2]))})

部分数据截图效果如下:


Python是一门非常不错的编程语言,薪资待遇高、就业前景好。即使你不想出去上班,也可以利用Python在家做兼职(比如爬取客户需要的数据、量化交易、代写程序等)。

如果你对Python感兴趣,想通过学习Python获取更高的薪资,那下面这套Python学习资料一定对你有用!

资料包括:Python安装包+激活码、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等学习教程。0基础小白也能听懂、看懂,跟着教程走,带你从零基础系统性地学好Python!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述
二、Python学习软件

工欲善其事,必先利其器。学习Python常用的开发软件都在这里了!
在这里插入图片描述
三、Python入门学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述

四、Python练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

五、Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。这份资料也包含在内的哈~在这里插入图片描述

六、Python面试资料

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述
七、资料领取

上述完整版Python全套学习资料已经上传CSDN官方,需要的小伙伴可自行微信扫描下方CSDN官方认证二维码免费领取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以回答你关于Python正则表达式的问题。 Python正则表达式是一种用来匹配和处理字符串的工具。它可以在字符串中搜索和匹配特定的模式,以实现更高效和精确的数据处理。Python的re模块提供了完整的正则表达式支持,并且非常强大和灵活。 使用Python正则表达式,你可以实现各种字符串操作,比如搜索、替换、分割、提取等等。它的语法相对简单,但是功能非常强大,可以满足大部分的字符串处理需求。 在使用Python正则表达式时,你需要掌握一些基本的语法规则,比如元字符、字符集、重复、分组等等。这些语法规则可以组合在一起,形成复杂的匹配模式,以实现更加精细的字符串处理。 总之,Python正则表达式是一种非常有用的工具,可以大大提高字符串处理的效率和精确度。如果你想深入了解它的用法和技巧,可以查看Python官方文档中关于re模块的详细说明。 ### 回答2: Python正则表达式是一种强大的文本匹配和处理工具,通过使用特定的模式来识别和操作文本中的字符串。正则表达式通常被用于从文本中提取特定的信息、验证输入的有效性、进行替换或搜索等操作。 Python正则表达式的语法使用元字符和特殊字符来定义搜索模式,其中元字符用于描述字符类型或位置,特殊字符用于描述重复次数或匹配方式。常见的元字符包括"."(匹配任意字符)、"\d"(匹配数字字符)、"\w"(匹配字母、数字或下划线字符)、"\s"(匹配空白字符)等。特殊字符包括"*"(匹配前面的模式0次或多次)、"+"(匹配前面的模式1次或多次)、"?"(匹配前面的模式0次或1次),以及花括号{}(指定前面模式的重复次数)等。 使用Python正则表达式时,常见的操作包括匹配、搜索、替换和分割。匹配操作通过`re.match()`或`re.search()`函数实现,用于从字符串的起始位置或任意位置开始匹配;搜索操作通过`re.findall()`或`re.finditer()`函数实现,用于在整个字符串中搜索匹配的内容;替换操作通过`re.sub()`函数实现,用于替换匹配到的内容;分割操作通过`re.split()`函数实现,用于按指定的模式分割字符串。 Python正则表达式还支持分组、捕获、非捕获、反向引用等高级特性,可通过使用括号`()`进行分组,并使用`\number`的方式引用分组匹配到的内容。 总而言之,Python正则表达式提供了一套强大且灵活的工具来处理文本匹配和处理的需求。学习和熟练掌握正则表达式的使用,对于处理和分析文本数据将大有裨益。 ### 回答3: Python正则表达式是一种用来匹配字符串模式的工具。它使用一种特殊的语法来描述字符串的模式,然后通过与给定的字符串进行比较,判断是否匹配。 在Python中,我们使用re模块来使用正则表达式。首先,我们需要导入re模块,然后使用re模块提供的函数来进行匹配操作。 正则表达式中的一些基本概念包括: 1. 字符组:用方括号[]表示,表示匹配其中的任意一个字符。例如[abc]表示匹配字符a、b或c。 2. 量词:用来表示匹配多个字符的数量。例如*表示匹配0个或多个字符,+表示匹配1个或多个字符,?表示匹配0个或1个字符。 3. 元字符:具有特殊义的字符,例如.表示匹配除换行符外的任意字符,\d表示匹配任意一个数字字符。 4. 转义字符:使用反斜杠\来转义元字符。例如\.表示匹配点字符。 5. 边界匹配:^表示匹配字符串的开头,$表示匹配字符串的结尾。 可以通过这些基本概念进行复杂模式的匹配。例如,使用re模块的match函数可以判断一个字符串是否以某个模式开头,使用search函数可以在字符串中搜索匹配某个模式的子串,使用findall函数可以找到所有匹配的子串。 除了基本概念外,Python正则表达式还提供了一些更高级的功能,例如分组、捕获和替换等。 总之,Python正则表达式是一种强大的工具,可以用于字符串的匹配和处理。掌握正则表达式的基本语法和常用函数,可以帮助我们更高效地处理字符串操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值