【Python 每日一技】文本查找和替换
文章目录
- 1 问题
- 2. 解决方案
- 3. 讨论
1 问题
你希望查找并替换一段文本中的模式串。
2. 解决方案
如果以简单的字符串字面量形式给出模式串,那么你通常可以使用基本的字符串方法如 str.replace()
,例如:
>>> text = 'yeah, but no, but yeah, but no, but yeah'
>>> text.replace('yeah', 'yep')
'yep, but no, but yep, but no, but yep'
对于更加复杂的模式串,则需要结合 re
模块的 sub()
函数/方法以及正则表达式。为了演示,假设你希望将形如 11/27/2012
的日期重写为 2012-11-27
形式。例如:
>>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
>>> import re
>>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
'Today is 2012-11-27. PyCon starts 2013-3-13.'
在 re.sub()
函数中,第一个参数用于文本匹配的正则表达式,第二个参数是用于进行替换的文本模式,其中的反斜杠加数字如 \3
指的是第一个参数中的捕捉分组编号。
如果你希望使用某个正则表达式进行多次重复的文本匹配,那么可以考虑提前对其进行编译以提高执行的速度。例如:
>>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
>>> import re
>>> date_pattern = re.compile(r'(\d+)/(\d+)/(\d+)')
>>> date_pattern.sub(r'\3-\1-\2', text)
'Today is 2012-11-27. PyCon starts 2013-3-13.'
对于复杂的文本替换,还可以考虑定义一个用于文本替换的回调函数。例如:
>>> from calendar import month_abbr
>>> def change_date(m):
... mon_name = month_abbr[int(m.group(1))]
... return '{} {} {}'.format(m.group(2), mon_name, m.group(3))
...
>>> re.sub(r'(\d+)/(\d+)/(\d+)', change_date, text)
'Today is 27 Nov 2012. PyCon starts 13 Mar 2013.'
>>> date_pattern.sub(change_date, text)
'Today is 27 Nov 2012. PyCon starts 13 Mar 2013.'
如上所述,作为输入,传入替换回调函数的实参是类似 match()
和 find()
以及 search()
等函数返回的匹配对象。在回调函数中通过调用匹配对象的 group()
方法以剥离出想要的部分。
如果你除了想获取替换后的文本之外,还希望知道发生了多少次替换,那么可以使用 re.subn()
函数,例如:
>>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
>>> re.subn(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
('Today is 2012-11-27. PyCon starts 2013-3-13.', 2)
>>> text_with_replacement, num = re.subn(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
>>> text_with_replacement
'Today is 2012-11-27. PyCon starts 2013-3-13.'
>>> num
2
3. 讨论
对于使用正则表达式进行文本的搜索和替换,基本上都逃不过上述 re.sub()
函数的用法。实际上,最有挑战性是其实是写出正确的正则表达式。
【Python 每日一技】文本查找和替换相关推荐
- 【Python 每日一技】根据序列中每个元素共同的数据域进行分组迭代
文章目录 1 问题 2. 解决方案 3. 讨论 1 问题 你有一个元素均为字典或其他类型的序列,你希望根据每个元素中的同一个字段(例如:日期)对序列中的所有元素进行分组迭代. 2. 解决方案 iter ...
- Linux学习之文本查找编辑替换命令
本文主要包括Linux环境下最常使用的文本查找编辑替换等命令,包括: find grep awk sed find Linux系统下用于文本查找定位的命令行. 命令语法: find [-H] [-L] ...
- html标签替换工具,文本查找与替换工具Replace Studio Pro v9.6优化版
软件介绍 Replace Studio Pro 是一个功能超强的文本查找与替换工具.该工具不仅可以帮助用户搜索和替换计算机中的所有文件,而且还具有在Windows中找到和替换的功能. Replace ...
- Python 实用技巧之正则表达式查找和替换文本的操作方法
1.需求 我们想对字符串中的文本做查找和替换. 2.解决方案 对于简单的文本模式,使用str.replace()即可. 例如: 学习python中有什么不懂的地方,小编这里推荐加小编的python学习 ...
- python字符串find函数-Python字符串的方法,查找和替换
Python数字 整型 int 如:1 4 8 浮点型 float 如:1.0 3.6 78.9 长整型 long 如:1L 37565846588L(在一个整数后面加上L就是长整型,理论上长整型的长 ...
- python 筛选重复数据和不重复数据_[Python] Pandas 对数据进行查找、替换、筛选、排序、重复值和缺失值处理...
1. 数据文件 2. 读数据 import pandas as pd data = pd.read_csv('D:\git\python\code\第5章\产品统计表.csv') print(data ...
- Python每日一记127文本型数字转化为数值型数字(eval函数)
不知道大家有没有注意到这样一个问题,那就是我们进行format数字格式化后,是文本型数字,这样是不能进行后续计算的,如何将其转化为数值型数字呢?这里我们不用int(),或者float() 这个时候我们 ...
- 【Python 每日一技】建立多个值和单个键的映射
1 问题 你希望创建一个字典,该字典可以建立多个值和单个键之间的映射(即所谓的多值字典). 2. 解决方案 在 Python 中,基于普通的字典类 dict 创建的对象一般只可以存储一个键和一个值的映 ...
- 【Python 每日一技】根据任意分隔符分割字符串
文章目录 1 问题 2. 解决方案 3. 讨论 1 问题 你需要分割一个字符串,但是字符串内的分隔符并不是同一个. 2. 解决方案 实际上,虽然字符串对象有一个 split() 方法,但是该方法一般只 ...
最新文章
- 搭建eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo
- 关系数据库SQL之可编程性存储过程
- VTK:几何对象之GeometricObjectsDemo
- HDU1214 圆桌会议(找规律,数学)
- 初识Mysql(一)
- java线程池,信号量使用demo
- 用 Mars Remote API 轻松分布式执行 Python 函数
- SQL中in参数在存储过程中传递及使用的方法
- 【Nodejs】npm cnpm 淘宝镜像
- YAML_01 YAML语法和playbook写法
- mysql 升级高可用_MySQL高可用方案升级规划
- 谈论豆瓣网捧着金饭碗要饭
- 达梦数据库技术分享索引贴
- 基金投资理财专栏介绍
- 交互设计师眼中的需求分析
- Sort of sort
- 小程序绑定手机,发送验证码
- 初入python世界——python基础语法
- Linux系统下服务和运行目标管理——单用户和多用户模式的切换
- 极客时间和极客学院_极客奔跑
热门文章
- 电商平台常用技术汇总
- 猫猫学iOS之安装cocoapods
- 凝思磐石安全操作系统官方版 下载
- 小飞鱼通达二开 企业微信与通达OA的另一种集成方式(图文)
- 晋江一中2021高考成绩查询,2019高考成绩出炉,晋江第一名揭晓!
- 问道服务器etc修改教程,问道自定义宠物etc写法教程
- (一)云计算技术学习--基础概念
- 【Bug】AttributeError: module ‘gast‘ has no attribute ‘Index‘
- 三国杀显示服务器登录错误,三国杀登录超时怎么办?登陆失败解决方法[多图]...
- 基于双目相机的图像深度信息提取算法matlab仿真