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

正则表达式的高级方法

正则表达式的高级方法

正则表达式(regex)不仅仅是简单的模式匹配工具,它还提供了一系列高级功能,使得处理复杂文本任务变得更加灵活和强大。以下是一些Python中正则表达式的高级用法:

1. 命名捕获组

命名捕获组允许你为每个捕获的子表达式赋予一个名称,这在处理复杂的匹配时特别有用,因为它可以提高代码的可读性和维护性。

import repattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
match = re.match(pattern, '2023-10-12')if match:print(f"Year: {match.group('year')}, Month: {match.group('month')}, Day: {match.group('day')}")
2. 非捕获组

有时候你可能只想分组某些部分的表达式而不希望它们被单独捕获,这时可以使用非捕获组(?:...)

pattern = r'(?:\d{3}-){2}\d{4}'  # 匹配形如123-456-7890的电话号码
matches = re.findall(pattern, 'My numbers are 123-456-7890 and 987-654-3210.')
print(matches)  # 输出: ['123-456-7890', '987-654-3210']
3. 前瞻断言与后瞻断言

这些是用于指定匹配条件的特殊构造,但不消耗字符。前瞻断言(?=...)确保当前位置之后的字符串符合某个模式;后瞻断言(?<=...)确保当前位置之前的字符串符合某个模式。

# 前瞻断言:查找所有后面跟着'.com'的单词
pattern = r'\b\w+(?=\.com\b)'
text = "example.com is a website."
print(re.findall(pattern, text))  # 输出: ['example']# 后瞻断言:查找所有前面有'@'符号的单词
pattern = r'(?<=@)\w+'
text = "Email me at user@example.com"
print(re.findall(pattern, text))  # 输出: ['example']
4. 惰性量词

默认情况下,量词(如*, +, ?)是贪婪的,这意味着它们会尽可能多地匹配字符。使用惰性量词(通过在量词后加?),可以让它们尽可能少地匹配字符。

html = '<div>First paragraph</div><div>Second paragraph</div>'
pattern = r'<div>(.*?)</div>'  # 使用惰性量词'?'
matches = re.findall(pattern, html)
print(matches)  # 输出: ['First paragraph', 'Second paragraph']
5. 条件表达式

条件表达式(?(id/name)yes-pattern|no-pattern)允许根据是否匹配了某个特定的组来决定接下来的匹配规则。

pattern = r'^(?:(?P<int>\d+)|(?P<float>\d+\.\d+))$'
match = re.match(pattern, '123.45')
if match:if match.group('int'):print("Integer:", match.group('int'))elif match.group('float'):print("Float:", match.group('float'))
6. 内联标志

可以在正则表达式的某些部分内部启用或禁用标志,而不需要在整个表达式中都应用该标志。例如,(?i)表示忽略大小写的匹配,只影响其后的部分。

pattern = r'(?i)hello world'  # 忽略大小写
text = "Hello World"
print(bool(re.search(pattern, text)))  # 输出: True
7. 回溯限制

为了优化性能,避免不必要的回溯,可以使用原子组(?>)...来阻止回溯进入括号内的表达式。

pattern = r'(?>(?:\d{3}-){2}\d{4})'  # 原子组防止回溯
text = "Call me at 123-456-7890 or 987-654-3210."
matches = re.findall(pattern, text)
print(matches)  # 输出: ['123-456-7890', '987-654-3210']
8. 递归模式

对于嵌套结构的数据(如HTML标签、括号等),可以使用递归模式(?R)来匹配任意深度的嵌套。

pattern = r'\((?:[^()]*|(?R))*\)'  # 匹配嵌套括号
text = "(This (is (a test)) string)"
matches = re.findall(pattern, text)
print(matches)  # 输出: ['(is (a test))']

http://www.mrgr.cn/news/79689.html

相关文章:

  • 数据库数据恢复—ORACLE常见故障有哪些?如何恢复数据?
  • Ruby On Rails 笔记5——常用验证下
  • AI智算-k8s部署大语言模型管理工具Ollama
  • SAP Ariba Buying_Additional Receiving Features
  • 在 Ansys Q3D 中求解直流和交流电感
  • 初识Linux · 日志编写
  • STL之空间配置器allocator
  • 正则化:机器学习中的泛化利器
  • webrtc-java:引领Java进入实时通信新时代
  • 线上常见问题案例及排查工具
  • DevOps持续集成
  • STM32-C语言基础知识
  • 力扣HOT 100(图)
  • 多人聊天室 NIO模型实现
  • 1.1.Flink的项目初始化和Hello-world
  • 在Ubuntu22.04 jammy下用qemu模型riscv32环境装鸿蒙(未完成,待续)
  • PDF处理的创新工具:福昕低代码平台尝鲜
  • leecode中的面试100题
  • 【推荐算法】单目标精排模型——DIN
  • 阿里云ack部署rabbitmq集群
  • 【sgUploadList】自定义组件:基于elementUI的el-upload封装的上传列表组件,适用于上传附件时
  • 第4章:颜色和背景 --[CSS零基础入门]
  • unity中的UI介绍
  • 外包干了5天,技术明显退步。。。。。
  • 《蓝桥杯比赛规划》
  • unity 2D像素种田游戏学习记录(自用)