当前位置: 首页 > news >正文

Python3(30) 正则表达式

        在 Python 编程中,正则表达式是处理文本的强大武器,它能高效地进行模式匹配、搜索和替换操作。这篇博客将通过代码示例深入学习 Python3 正则表达式的相关知识,方便日后复习回顾。


一、正则表达式基础概念

1.1 什么是正则表达式

        正则表达式是一种特殊的字符序列,用于描述文本的模式。在 Python 中,借助re模块可以使用正则表达式来处理文本。比如,想要在一段文本中查找所有的数字,就可以使用正则表达式\d+来匹配一个或多个数字字符。

1.2 正则表达式的基本语法

  1. 字符匹配:普通字符(如字母、数字)直接匹配自身。例如,正则表达式python能精确匹配字符串python
  2. 字符类:使用方括号[]定义字符类,匹配其中任意一个字符。比如[Pp]ython可以匹配Pythonpython[0-9]匹配任意一个数字;[a-zA-Z]匹配任意一个字母。
  3. 特殊字符类
    • \d:匹配一个数字字符,等价于[0-9]
    • \D:匹配一个非数字字符,等价于[^0-9]
    • \s:匹配任何空白字符,包括空格、制表符、换页符等,等价于[ \f\n\r\t\v]
    • \S:匹配任何非空白字符,等价于[^ \f\n\r\t\v]
    • \w:匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
    • \W:匹配任何非单词字符,等价于[^A-Za-z0-9_]

二、re 模块的常用函数

2.1 re.match 函数

  re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功,就返回None

import re
match_result = re.match(r'www', 'www.runoob.com')
if match_result:print(f"匹配成功,起始位置: {match_result.start()},结束位置: {match_result.end()}")
else:print("匹配失败")

        在这个例子中,r'www'是正则表达式模式,'www.runoob.com'是待匹配的字符串。如果匹配成功,可以通过match_resultstart()end()方法获取匹配的起始和结束位置。

2.2 re.search 函数

  re.search扫描整个字符串并返回第一个成功的匹配。

import re
search_result = re.search(r'com', 'www.runoob.com')
if search_result:print(f"匹配成功,起始位置: {search_result.start()},结束位置: {search_result.end()}")
else:print("匹配失败")

        与re.match不同,re.search会在整个字符串中查找匹配项,而不仅仅从起始位置开始。

2.3 re.findall 函数

  re.findall在字符串中找到正则表达式所匹配的所有子串,并返回一个列表。如果有多个匹配模式,则返回元组列表。

import re
findall_result = re.findall(r'\d+', 'runoob 123 google 456')
print(findall_result)

        上述代码使用\d+匹配一个或多个数字字符,re.findall函数会找到字符串中所有符合该模式的子串,并返回列表['123', '456']

2.4 re.finditer 函数

  re.finditerre.findall类似,也是在字符串中找到正则表达式所匹配的所有子串,但它返回的是一个迭代器。

import re
finditer_result = re.finditer(r'\d+', '12a32bc43jf3')
for match in finditer_result:print(match.group())

        通过迭代re.finditer返回的迭代器,可以逐个获取匹配的子串。

2.5 re.sub 函数

  re.sub用于替换字符串中的匹配项。

import re
phone = "2004-959-559 # 这是一个电话号码"
new_phone = re.sub(r'#.*$', "", phone)
print(new_phone)

        在这个例子中,r'#.*$'表示匹配从#开始到字符串末尾的内容,re.sub函数将匹配到的内容替换为空字符串,从而删除了电话号码中的注释部分。

2.6 re.split 函数

  re.split按照能够匹配的子串将字符串分割后返回列表。

import re
split_result = re.split(r'\W+', 'runoob, runoob, runoob.')
print(split_result)

        这里\W+表示匹配一个或多个非单词字符,re.split函数根据这个模式将字符串分割成多个部分,并返回列表['runoob', 'runoob', 'runoob', '']


三、正则表达式修饰符

        正则表达式修饰符可以控制匹配的方式,多个修饰符可以通过按位或(|)组合使用。

3.1 re.IGNORECASE(或 re.I)

        使匹配对大小写不敏感。

import re
pattern = re.compile(r'apple', flags=re.IGNORECASE)
match_result = pattern.match('Apple')
if match_result:print(match_result.group())

        在这个例子中,即使字符串'Apple'的首字母大写,由于使用了re.IGNORECASE修饰符,依然能匹配成功。

3.2 re.MULTILINE(或 re.M)

        多行匹配,影响^$的行为,使它们匹配字符串每一行的开头和结尾。

import re
pattern = re.compile(r'^\d+', flags=re.MULTILINE)
text = '123\n456\n789'
findall_result = pattern.findall(text)
print(findall_result)

        在多行文本中,^原本只匹配字符串的开头,但使用re.MULTILINE修饰符后,它会匹配每一行的开头,因此返回['123', '456', '789']

3.3 re.DOTALL(或 re.S)

        使.匹配包括换行符在内的任意字符。

import re
pattern = re.compile(r'a.b', flags=re.DOTALL)
match_result = pattern.match('a\nb')
if match_result:print(match_result.group())

        正常情况下,.不匹配换行符,但使用re.DOTALL修饰符后,它可以匹配ab之间的换行符。


四、编译正则表达式

        使用re.compile函数可以编译正则表达式,生成一个正则表达式(Pattern)对象,供match()search()等函数使用。这在需要多次使用同一个正则表达式时能提高效率。

import re
pattern = re.compile(r'\d+')
match_result = pattern.match('one12twothree34four', 3, 10)
if match_result:print(match_result.group())

        在上述代码中,先使用re.compile编译正则表达式\d+,得到Pattern对象pattern,然后使用pattern.match进行匹配操作。


五、总结

        Python3 的re模块结合正则表达式,为文本处理提供了强大而灵活的工具。通过掌握正则表达式的基本语法、re模块的常用函数、修饰符以及编译正则表达式的方法,可以高效地处理各种文本匹配、搜索和替换任务。在实际编程中,应根据具体需求合理运用这些知识,编写简洁、高效的文本处理代码。希望这篇博客能帮助你更好地复习和巩固 Python3 正则表达式的相关知识,在文本处理场景中灵活运用。

相关文章:

  • 两数相加(2)
  • Profinet转CanOpen网关,打破协议壁垒的关键技术
  • 国内特殊车辆检测数据集VOC+YOLO格式4930张3类别
  • NVMe控制器IP设计之接口模块
  • Python核心编程深度解析:作用域、递归与匿名函数的工程实践
  • Python自动化-python基础(下)
  • C++中的static_cast:类型转换的安全卫士
  • 警备,TRO风向预警,In-N-Out Burgers维权风暴来袭
  • 基于Python的在线教育平台的设计与实现
  • 红黑树删除的实现与四种情况的证明
  • 探秘 Canva AI 图像生成器:重塑设计创作新范式
  • 编写第一个MCP Server之Hello world
  • 杆件的拉伸与压缩变形
  • python tkinter 实现 带界面(GUI)的RSA加密、签名
  • 什么是静态住宅IP?为什么静态住宅IP能提高注册通过率?
  • torch.nn 下的常用深度学习函数
  • 卫星导航算法程序设计——单点定位测速(SPV)
  • MRNet 数据集分享
  • 气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解
  • uniapp开发HarmonyOS NEXT应用之项目结构详细解读
  • 伊美第四轮核问题谈判开始
  • 同济大学原常务副校长、著名隧道及地下工程专家李永盛逝世
  • 解放军仪仗分队参加白俄罗斯纪念苏联伟大卫国战争胜利80周年阅兵活动
  • 人民日报钟声:平等对话是解决大国间问题的正确之道
  • AI药企英矽智能第三次递表港交所:去年亏损超1700万美元,收入多数来自对外授权
  • 云南一餐馆收购长江野生鱼加工为菜品,被查处罚款