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

Python正则表达式详解(一)

正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换字符串中的特定模式。在Python中,我们使用re模块来处理正则表达式。

目录

基础概念

1.re模块核心函数

1.1 re.match() - 从字符串开头匹配

1.2 re.fullmatch() - 检查整个字符串是否完全匹配给定的正则表达式

2. 与相关函数的对比

2.1 re.fullmatch() vs re.match()

2.2 re.fullmatch() vs re.search()

2.3. re.fullmatch() vs re.findall()

2.4 等价写法

2.5 实际应用示例

3. re模块中的其他函数

3.1 re.search() - 搜索整个字符串

3.2 re.findall() - 查找所有匹配

3.3 re.finditer() - 返回匹配迭代器

3.4 re.sub() - 替换匹配文本

4. Python的 re.sub() 函数可以使用捕获组,并且有两种主要方式:

4.1 在替换字符串中使用捕获组

4.2 使用函数处理匹配结果(更灵活)

4.3 命名捕获组的使用

4.4 多个捕获组的例子


基础概念

正则表达式是由普通字符(如字母、数字)和特殊字符(称为"元字符")组成的字符串模式,用于描述文本的匹配规则。

#使用前需导入模块库 import re

1.re模块核心函数

1.1re.match()-从字符串开头匹配

pattern = r'hello' text = 'hello world' result = re.match(pattern, text) if result: print(f"匹配成功: {result.group()}") else: print("匹配失败")

1.2 re.fullmatch() -检查整个字符串是否完全匹配给定的正则表达式

  • 只有当整个字符串从头到尾都匹配模式时,才返回匹配对象
  • 否则返回None

2. 与相关函数的对比

2.1re.fullmatch()vsre.match()

import re pattern = r'\d+' text1 = "123" text2 = "123abc" text3 = "abc123" # re.fullmatch() - 必须整个字符串匹配 print(re.fullmatch(pattern, text1)) # 匹配成功: <re.Match object> print(re.fullmatch(pattern, text2)) # 匹配失败: None print(re.fullmatch(pattern, text3)) # 匹配失败: None # re.match() - 只检查开头 print(re.match(pattern, text1)) # 匹配成功: <re.Match object> print(re.match(pattern, text2)) # 匹配成功: <re.Match object> print(re.match(pattern, text3)) # 匹配失败: None

2.2re.fullmatch()vsre.search()

import re pattern = r'\d+' text1 = "123" text2 = "abc123def" text3 = "abc" # re.fullmatch() - 整个字符串匹配 print(re.fullmatch(pattern, text1)) # 匹配成功 print(re.fullmatch(pattern, text2)) # 匹配失败 print(re.fullmatch(pattern, text3)) # 匹配失败 # re.search() - 在字符串任意位置匹配 print(re.search(pattern, text1)) # 匹配成功 print(re.search(pattern, text2)) # 匹配成功(找到"123") print(re.search(pattern, text3)) # 匹配失败

2.3.re.fullmatch()vsre.findall()

import re pattern = r'\d+' text = "123 abc 456 def" print(re.fullmatch(pattern, text)) # 匹配失败: None print(re.findall(pattern, text)) # 匹配成功: ['123', '456']

2.4等价写法

实际上,re.fullmatch(pattern, string)等价于:

# 方法1:使用 fullmatch result = re.fullmatch(r'\d+', text) # 方法2:使用 match 并在模式中添加 $ result = re.match(r'\d+$', text) # 方法3:手动检查 match_obj = re.match(r'\d+', text) if match_obj and match_obj.group() == text: result = match_obj else: result = None

2.5实际应用示例

import re # 验证各种输入 def validate_inputs(): test_cases = [ ("variable1", True), # 有效 ("1variable", False), # 数字开头,无效 ("var_name", True), # 有效 ("var name", False), # 有空格,无效 ("var!", False), # 有特殊字符,无效 ("_var", False), # 下划线开头,无效(根据规则) ("VAR", True), # 全大写,有效 ("v", True), # 单字母,有效 ] pattern = r'^[a-zA-Z]\w*$' for text, expected in test_cases: result = re.fullmatch(pattern, text) is not None status = "✓" if result == expected else "✗" print(f"{status} '{text}': 预期={expected}, 实际={result}") validate_inputs()

3. re模块中的其他函数

3.1re.search()-搜索整个字符串

pattern = r'world' text = 'hello world' result = re.search(pattern, text) if result: print(f"找到匹配: {result.group()}")

3.2re.findall()-查找所有匹配

pattern = r'\d+' # 匹配一个或多个数字 text = '我有3个苹果和12个香蕉' results = re.findall(pattern, text) print(f"所有数字: {results}") # 输出: ['3', '12']

3.3re.finditer()-返回匹配迭代器

pattern = r'\w+' text = 'hello world python' for match in re.finditer(pattern, text): print(f"匹配: {match.group()}, 位置: {match.start()}-{match.end()}")

3.4re.sub()-替换匹配文本

pattern = r'\d+' text = '价格为100元,折扣20元' new_text = re.sub(pattern, 'XXX', text) print(f"替换后: {new_text}") # 输出: 价格为XXX元,折扣XXX元

4. Pythonre.sub()函数可以使用捕获组,并且有两种主要方式:

4.1在替换字符串中使用捕获组

import re pattern = r'(价格为)(\d+)' text = '价格为100元,折扣20元' new_text = re.sub(pattern, r'\1XXX', text) # \1 引用第一个捕获组 print(f"替换后: {new_text}") # 输出: 替换后: 价格为XXX元,折扣20元

4.2使用函数处理匹配结果(更灵活)

import re def replace_price(match): # match.group(1) 是第一个捕获组 ("价格为") # match.group(2) 是第二个捕获组 ("100") return f"{match.group(1)}{int(match.group(2)) * 0.8}" # 打8折 pattern = r'(价格为)(\d+)' text = '价格为100元,折扣20元' new_text = re.sub(pattern, replace_price, text) print(f"替换后: {new_text}") # 输出: 替换后: 价格为80元,折扣20元

4.3命名捕获组的使用

import re pattern = r'(?P<prefix>价格为)(?P<price>\d+)' text = '价格为100元,折扣20元' # 使用命名捕获组 new_text1 = re.sub(pattern, r'\g<prefix>XXX', text) print(f"方法1: {new_text1}") # 输出: 方法1: 价格为XXX元,折扣20元 # 使用函数处理命名捕获组 def replace_named(match): return f"{ match.group('prefix')+'!!双十一特惠!!'}{int(match.group('price')) + 50}" new_text2 = re.sub(pattern, replace_named, text) print(f"方法2: {new_text2}") # 方法2: 价格为!!双十一特惠!!150元,折扣20元

4.4多个捕获组的例子

import re # 匹配并捕获前缀、数字、后缀 pattern = r'(\D+)(\d+)(\D+)' # 非数字 + 数字 + 非数字 text = '价格为100元,折扣20元' new_text = re.sub(pattern, r'\1[\2]\3', text) print(f"替换后: {new_text}") # 输出: 替换后: 价格为[100]元,折扣20元 import re pattern = r'(\D+)(\d+)(\D+)' text = '价格为100元,折扣20元' # 使用findall查看所有匹配 matches = re.findall(pattern, text) print(f"findall结果: {matches}") print(f"匹配数量: {len(matches)}") # 使用search查看第一个匹配的细节 match = re.search(pattern, text) if match: print(f"\n第一个匹配的完整内容: '{match.group()}'") print(f"第一个捕获组(\\D+): '{match.group(1)}'") print(f"第二个捕获组(\\d+): '{match.group(2)}'") print(f"第三个捕获组(\\D+): '{match.group(3)}'") print(f"第三个捕获组的长度: {len(match.group(3))}") findall结果: [('价格为', '100', '元,折扣')] 匹配数量: 1 第一个匹配的完整内容: '价格为100元,折扣' 第一个捕获组(\D+): '价格为' 第二个捕获组(\d+): '100' 第三个捕获组(\D+): '元,折扣' 第三个捕获组的长度: 4
http://www.jsqmd.com/news/813720/

相关文章:

  • 跨境电商OPC,掌握这几款产品,实现效率提升,欢迎评论交流
  • 毕业答辩 PPT 做了 3 天还被导师打回?okbiye AI PPT 一键搞定,我把流程和效果都给你测透了
  • DC-DC转换器技术解析与应用指南
  • 嵌入式Day14--函数指针与指针函数
  • 3步搞定视频硬字幕提取:本地化、多语言、高效率的终极解决方案
  • 尾盘选股法程序开发学习初期
  • 08:redis-实战+原理
  • 基于MCP协议实现AI助手安全远程操控服务器的完整指南
  • 番茄小说下载器终极指南:一键获取全网小说并智能转换格式
  • AI Agent驱动的智能着陆页生成:从概念到Next.js工程实践
  • 我到底是不是嘉豪?
  • 基于Semantic Release与GitHub Actions的前端自动化发布流程实战
  • 哈密顿赞颂拉格朗日方程为“科学的诗篇“
  • 逃离“时间回廊”:深度解析华为 FusionCompute 虚拟机时间回退迷局
  • 如何使用 Jenkins 流水线自动构建并推送 Docker 镜像到私有仓库
  • Scrapstyle:基于样式解析的现代Web数据抓取方案
  • MPC轨迹规划与控制算法【附代码】
  • Sunshine游戏串流服务器:快速搭建你的终极跨平台游戏串流系统
  • 城市规划和软件系统设计:复杂度管理的艺术
  • PUBG罗技鼠标宏:5分钟快速上手自动压枪终极指南
  • Ollama Operator:在Kubernetes上轻松部署与管理大语言模型
  • 深入查看Taotoken用量看板分析API调用消耗与优化建议
  • BrowserTools MCP:让AI助手安全操控浏览器的本地化工具详解
  • GPU硬件加速优化:体积渲染与3D高斯泼溅技术
  • 基于Go与K8s Client-go实现多租户应用一键部署API服务
  • 在澳洲,名义雇主合法吗?如何确保合规与效率?
  • 自签名证书
  • Perplexity引用导出结果不可复现?独家“引用指纹”校验技术首次公开,误差率降至0.02%以内!
  • 多模型选型场景下如何利用Taotoken模型广场进行决策
  • RanjuUI:轻量级现代UI组件库的设计理念与工程实践