Python学习笔记——Day05

本文深入解析Python正则表达式的基本概念与使用技巧,通过实际案例演示如何进行字符串匹配、替换与提取,涵盖电话号码验证、文本内容替换及数字模式匹配等应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python学习笔记——Day05

第五天,讲真有点吃力了,因为需要记忆的内容有些多了。

python正则表达式

先来看什么是正则表达式,以下内容来自百度百科。正则表达式又称规则表达式,(Regular Expression,代码中简写为regex、regexp或RE),计算机科学的一个概念。通常被用来检索,替换那些符合某个模式(规则)的文本。

正则表达式概念

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

正则表达式目的

给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

  1. 给定的祝福词是否符合正则表达式的过滤逻辑(称作“匹配”):
  2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。

正则表达式特点

  1. 灵活性、逻辑性和功能性非常强;
  2. 可以迅速地用极简单的方式达到字符串的复杂控制。
  3. 对于刚接触的人来说,比较晦涩难懂。

正则匹配符号

符号解释示例说明
.匹配任意字符b.t可以匹配bat / but / b#t / b1t等
\w匹配字母/数字/下划线b\wt可以匹配bat / b1t / b_t等
但不能匹配b#t
\s匹配空白字符(包括\r、\n、\t等)love\syou可以匹配love you
\d匹配数字\d\d可以匹配01 / 23 / 99等
\b匹配单词的边界\bThe\b
^匹配字符串的开始^The可以匹配The开头的字符串
$匹配字符串的结束.exe$可以匹配.exe结尾的字符串
\W匹配非字母/数字/下划线b\Wt可以匹配b#t / b@t等
但不能匹配but / b1t / b_t等
\S匹配非空白字符love\Syou可以匹配love#you等
但不能匹配love you
\D匹配非数字\d\D可以匹配9a / 3# / 0F等
\B匹配非单词边界\Bio\B
[]匹配来自字符集的任意单一字符[aeiou]可以匹配任一元音字母字符
[^]匹配不在字符集中的任意单一字符[^aeiou]可以匹配任一非元音字母字符
*匹配0次或多次\w*
+匹配1次或多次\w+
?匹配0次或1次\w?
{N}匹配N次\w{3}
{M,}匹配至少M次\w{3,}
{M,N}匹配至少M次至多N次\w{3,6}
|分支foo|bar可以匹配foo或者bar
(?#)注释
(exp)匹配exp并捕获到自动命名的组中
(? <name>exp)匹配exp并捕获到名为name的组中
(?:exp)匹配exp但是不捕获匹配的文本
(?=exp)匹配exp前面的位置\b\w+(?=ing)可以匹配I’m dancing中的danc
(?<=exp)匹配exp后面的位置(?<=\bdanc)\w+\b可以匹配I love dancing and reading中的第一个ing
(?!exp)匹配后面不是exp的位置
(?<!exp)匹配前面不是exp的位置
*?重复任意次,但尽可能少重复a.*b
a.*?b
将正则表达式应用于aabab,前者会匹配整个字符串aabab,后者会匹配aab和ab两个字符串
+?重复1次或多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{M,N}?重复M到N次,但尽可能少重复
{M,}?重复M次以上,但尽可能少重复

Python对正则表达式的支持

re模块来进行正则表达式的操作,核心函数如下

函数说明
compile(pattern, flags=0)编译正则表达式返回正则表达式对象
match(pattern, string, flags=0)用正则表达式匹配字符串 成功返回匹配对象 否则返回None
search(pattern, string, flags=0)搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None
split(pattern, string, maxsplit=0, flags=0)用正则表达式指定的模式分隔符拆分字符串 返回列表
sub(pattern, repl, string, count=0, flags=0)用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数
fullmatch(pattern, string, flags=0)match函数的完全匹配(从字符串开头到结尾)版本
findall(pattern, string, flags=0)查找字符串所有与正则表达式匹配的模式 返回字符串的列表
finditer(pattern, string, flags=0)查找字符串所有与正则表达式匹配的模式 返回一个迭代器
purge()清除隐式编译的正则表达式的缓存
re.I / re.IGNORECASE忽略大小写匹配标记
re.M / re.MULTILINE多行匹配标记

练习

练习一:匹配正确的电话号码

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:验证输入的手机号码
import re


def main():
    # 验证手机号码
    # 移动号码段: 139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147
    # 联通号码段: 130、131、132、136、185、186、145
    # 电信号码段: 133、153、180、189
    tel = input("请输入你的电话号码:")
    if tel.isdigit():
        m1 = re.match(r'(13[0-9])|(14[5|7])|(15[0-3]|[7-9])|(18[023]|[5-9])/d{8}$', tel)
        if not m1:
            print("请输入正确的手机号")
        else:
            print("您的手机号为%s" % tel)


if __name__ == "__main__":
    main()

练习二:替换指定内容到行尾

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:正则表达式替换,从文件中读取文本,进行替换,abc后面的替换为' def'
import re


def main():
    try:
        with open('text.txt', 'r', encoding='utf-8') as file:
            with open('text_update.txt', 'a', encoding='utf-8') as file1:
                for line in file.readlines():
                    file1.write(re.sub(r'abc.*', 'abc def', line))
    except FileNotFoundError:
        print("未找到文件")
    except LookupError:
        print("指定了未知的编码")
    except UnicodeDecodeError:
        print("解码错误")


if __name__ == "__main__":
    main()

text.txt

abc 123123
asd abcdea
sdfas
abcsdf1_

text_update.txt

abc def
asd abc def
sdfas
abc def

练习三:数字替换

#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:数字替换

# 把asdadas123asdasdas456asdasdasd789asdasd替换为:
# asdadas[123]asdasdas[456]asdasdasd[789]asdasd
import re


def main():
    source_str = 'asdadas123asdasdas456asdasdasd789asdasd'
    select_strs = re.findall(r'([0-9]*[0-9])', source_str)
    replace_str = source_str
    for select_str in select_strs:
        replace_str = re.sub(select_str, '['+select_str+']', replace_str, 1)
    print(replace_str)


if __name__ == "__main__":
    main()

写爬虫类应用的是否,正则表达式可以大展身手,我们可以循序的从网页代码中发现我们指定的模式并提取出我们需要的信息。

结语

第五天,因为有些事情只能写这么多了。明天继续吧。

如果你发现我的文章哪里有错误或者有什么好的想法可以联系我,我们一起学习共同进步,我的邮箱地址是lishuangCHN@gmail.com

let’s do more of those!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值