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

正则表达式入门:Python ‘ re ‘ 模块详解

正则表达式(Regular Expression,简称 re)是一种强大而灵活的工具,广泛用于字符串匹配、替换和分割等操作,尤其在处理网页爬虫数据时非常有用。Python 提供了 " re " 模块来支持正则表达式的使用,本文将结合常见的用法和示例,带你快速入门。

正则表达式的常用方法

匹配字符串

1. ' search() '
' search() ' 方法用于在字符串中查找符合正则表达式的第一个匹配项。它从字符串的任意位置开始匹配,返回一个 ' Match ' 对象,或者在没有匹配时返回 ' None '。

import repattern = r"\d+"  # 匹配一个或多个数字
string = "The price is 100 dollars."match = re.search(pattern, string)
if match:print(f"Found: {match.group()} at position {match.start()}-{match.end()}")
else:print("No match found!")

2. ' match() ' 
' match() ' 方法用于从字符串的开头匹配,如果开头不符合正则表达式,则返回 ' None '。

pattern = r"\d+"  # 匹配一个或多个数字
string = "100 dollars"match = re.match(pattern, string)
if match:print(f"Matched: {match.group()}")
else:print("No match found!")

3. ' fullmatch() '
' fullmatch() ' 方法要求整个字符串完全符合正则表达式,否则返回 ' None '。

pattern = r"\d+"  # 匹配一个或多个数字
string = "100"match = re.fullmatch(pattern, string)
if match:print(f"Full match: {match.group()}")
else:print("No full match!")

4. ' findall() '
' findall() ' 方法返回一个列表,包含字符串中所有符合正则表达式的匹配项。

pattern = r"\d+"  # 匹配一个或多个数字
string = "There are 100 apples and 200 oranges."matches = re.findall(pattern, string)
print(f"All matches: {matches}")

5. ' finditer() '
' finditer() ' 方法返回一个迭代器,每个元素都是一个 ' Match ' 对象,表示字符串中每一个匹配项。

pattern = r"\d+"  # 匹配一个或多个数字
string = "There are 100 apples and 200 oranges."matches = re.finditer(pattern, string)
for match in matches:print(f"Found: {match.group()} at position {match.start()}-{match.end()}")

替换字符串

1. ' sub() '
' sub() ' 方法用于替换字符串中所有符合正则表达式的部分,返回替换后的新字符串。

pattern = r"\d+"  # 匹配一个或多个数字
string = "There are 100 apples and 200 oranges."
replacement = "many"new_string = re.sub(pattern, replacement, string)
print(new_string)  # 输出:There are many apples and many oranges.

2. ' subn() '
' subn() ' 方法与 ' sub() ' 类似,但它返回一个元组,包括替换后的字符串和替换次数。

pattern = r"\d+"  # 匹配一个或多个数字
string = "There are 100 apples and 200 oranges."
replacement = "many"new_string, count = re.subn(pattern, replacement, string)
print(new_string)  # 输出:There are many apples and many oranges.
print(f"Replacements made: {count}")

分割字符串


 1. ' split() '
' split() ' 方法用于根据正则表达式匹配项来分割字符串,返回分割后的列表。

pattern = r"\s+"  # 匹配一个或多个空白字符
string = "This is a test."parts = re.split(pattern, string)
print(parts)  # 输出:['This', 'is', 'a', 'test.']

正则表达式中的特殊字符

在编写正则表达式时,理解特殊字符的用法非常重要。以下是一些常用的特殊字符:

' \w ':匹配字母、数字、下划线。
' \W ':匹配非字母、数字、下划线的字符。
' \d ':匹配数字

' \D ':匹配非数字字符。
' \s ':匹配空白字符(包括空格、制表符等)。
' \S ':匹配非空白字符。
' . ':匹配除换行符 ' \n ' 之外的任意字符(如果使用 ' re.S ' 标志,可以匹配包括换行符在内的所有字符)。
' ^ ':匹配字符串的开头(如果使用 ' re.M ' 标志,可以匹配每一行的开头)。
' $ ':匹配字符串的结尾(如果使用 ' re.M ' 标志,可以匹配每一行的结尾)。

贪婪与非贪婪匹配

正则表达式中的量词(如 ' * '、' + ' 和 ' ? ')默认情况下是贪婪的,它们会尽可能多地匹配字符。要进行非贪婪(尽可能少的匹配),可以在量词后加上 ' ? '。

' * ':匹配前面的字符 0 次或多次。
' + ':匹配前面的字符 1 次或多次。
' ? ':匹配前面的字符 0 次或 1 次。
' {n} ':匹配前面的字符恰好 n 次。
' {m,n} ':匹配前面的字符至少 m 次,至多 n 次。
' {m,n}? ':非贪婪地匹配前面的字符至少 m 次,至多 n 次。

字符类和分组

' [] ':定义一个字符类,匹配其中的任意一个字符。例如,' [aeiou] ' 匹配任意一个元音字母。
' | ':表示逻辑或,匹配 ' | ' 左右两边的任意一个表达式。例如,' a|b ' 匹配 "a" 或 "b"。
' () ':用于分组,可以将多个字符组合在一起作为一个单元,或者用于提取匹配到的子串。

示例:结合网页爬虫数据解析假设我们正在处理一段 HTML 数据,想要提取所有的 ' <a> ' 标签中的链接。我们可以使用正则表达式来简单地实现这一操作。

import rehtml_data = '''
<a href="https://example.com">Example</a>
<a href="https://another-example.com">Another Example</a>
'''# 正则表达式模式,用于匹配 href 属性中的 URL
pattern = r'href="(https?://[^"]+)"'# 使用 findall() 提取所有匹配的 URL
urls = re.findall(pattern, html_data)
print(urls)

在这个示例中,' (https?://[^"]+) ' 部分表示匹配 "http://" 或 "https://" 开头,后面跟随任意非引号的字符串,直到下一个引号为止。通过 ' re.findall() ',我们可以轻松提取出所有符合条件的链接。

总结

Python 的 ' re ' 模块提供了强大的正则表达式支持,使得字符串的匹配、替换和分割操作变得非常灵活和高效。无论是在处理爬虫数据还是在其他文本处理任务中,掌握正则表达式都将大大提升你的工作效率。

记住,正则表达式虽然强大,但也容易变得复杂,因此在使用时应尽量保持模式的简洁和可读性。同时,随着经验的积累,你会逐渐发现正则表达式的更多妙用。Happy coding!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++内存泄漏--**关于“异常0xc0000005 读取的位置 0xDDDDDDDD时发生冲突”
  • Flask详细教程
  • <STC32G12K128入门第十步>USB HID键盘
  • 5年前端面试之路
  • 【LeetCode Cookbook(C++ 描述)】一刷二叉树综合(下)
  • “AI+Security”系列第2期(三):面向LLM(大语言模型)的漏洞挖掘与对齐防御研究
  • 橙色简洁大气体育直播自适应模板赛事直播门户自适应网站源码
  • YOLOv10:实时端到端目标检测
  • Linux驱动学习之点灯(一)
  • SVN限制提交文件必须填写日志---实操笔记
  • 【杂乱笔记】Kmp字符串匹配算法
  • 鸿萌数据恢复服务:SQL Server 中的“PFS 可用空间信息不正确”错误
  • XSS游戏
  • HTTP范围放大攻击简记
  • 三丰云免费服务器
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Android 控件背景颜色处理
  • angular2开源库收集
  • Asm.js的简单介绍
  • css的样式优先级
  • Laravel Telescope:优雅的应用调试工具
  • laravel with 查询列表限制条数
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • node学习系列之简单文件上传
  • php ci框架整合银盛支付
  • python学习笔记 - ThreadLocal
  • Python中eval与exec的使用及区别
  • webgl (原生)基础入门指南【一】
  • 爱情 北京女病人
  • 从输入URL到页面加载发生了什么
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 爬虫模拟登陆 SegmentFault
  • 浅谈Golang中select的用法
  • elasticsearch-head插件安装
  • # C++之functional库用法整理
  • #{} 和 ${}区别
  • #stm32驱动外设模块总结w5500模块
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (26)4.7 字符函数和字符串函数
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (笔试题)分解质因式
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十三)Maven插件解析运行机制
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)Android布局类型(线性布局LinearLayout)
  • (四)c52学习之旅-流水LED灯
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)大型网站架构演变和知识体系
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .NET 中 GetProcess 相关方法的性能