文章目录

  • 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 每日一技】文本查找和替换相关推荐

  1. 【Python 每日一技】根据序列中每个元素共同的数据域进行分组迭代

    文章目录 1 问题 2. 解决方案 3. 讨论 1 问题 你有一个元素均为字典或其他类型的序列,你希望根据每个元素中的同一个字段(例如:日期)对序列中的所有元素进行分组迭代. 2. 解决方案 iter ...

  2. Linux学习之文本查找编辑替换命令

    本文主要包括Linux环境下最常使用的文本查找编辑替换等命令,包括: find grep awk sed find Linux系统下用于文本查找定位的命令行. 命令语法: find [-H] [-L] ...

  3. html标签替换工具,文本查找与替换工具Replace Studio Pro v9.6优化版

    软件介绍 Replace Studio Pro 是一个功能超强的文本查找与替换工具.该工具不仅可以帮助用户搜索和替换计算机中的所有文件,而且还具有在Windows中找到和替换的功能. Replace ...

  4. Python 实用技巧之正则表达式查找和替换文本的操作方法

    1.需求 我们想对字符串中的文本做查找和替换. 2.解决方案 对于简单的文本模式,使用str.replace()即可. 例如: 学习python中有什么不懂的地方,小编这里推荐加小编的python学习 ...

  5. python字符串find函数-Python字符串的方法,查找和替换

    Python数字 整型 int 如:1 4 8 浮点型 float 如:1.0 3.6 78.9 长整型 long 如:1L 37565846588L(在一个整数后面加上L就是长整型,理论上长整型的长 ...

  6. python 筛选重复数据和不重复数据_[Python] Pandas 对数据进行查找、替换、筛选、排序、重复值和缺失值处理...

    1. 数据文件 2. 读数据 import pandas as pd data = pd.read_csv('D:\git\python\code\第5章\产品统计表.csv') print(data ...

  7. Python每日一记127文本型数字转化为数值型数字(eval函数)

    不知道大家有没有注意到这样一个问题,那就是我们进行format数字格式化后,是文本型数字,这样是不能进行后续计算的,如何将其转化为数值型数字呢?这里我们不用int(),或者float() 这个时候我们 ...

  8. 【Python 每日一技】建立多个值和单个键的映射

    1 问题 你希望创建一个字典,该字典可以建立多个值和单个键之间的映射(即所谓的多值字典). 2. 解决方案 在 Python 中,基于普通的字典类 dict 创建的对象一般只可以存储一个键和一个值的映 ...

  9. 【Python 每日一技】根据任意分隔符分割字符串

    文章目录 1 问题 2. 解决方案 3. 讨论 1 问题 你需要分割一个字符串,但是字符串内的分隔符并不是同一个. 2. 解决方案 实际上,虽然字符串对象有一个 split() 方法,但是该方法一般只 ...

最新文章

  1. 搭建eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo
  2. 关系数据库SQL之可编程性存储过程
  3. VTK:几何对象之GeometricObjectsDemo
  4. HDU1214 圆桌会议(找规律,数学)
  5. 初识Mysql(一)
  6. java线程池,信号量使用demo
  7. 用 Mars Remote API 轻松分布式执行 Python 函数
  8. SQL中in参数在存储过程中传递及使用的方法
  9. 【Nodejs】npm cnpm 淘宝镜像
  10. YAML_01 YAML语法和playbook写法
  11. mysql 升级高可用_MySQL高可用方案升级规划
  12. 谈论豆瓣网捧着金饭碗要饭
  13. 达梦数据库技术分享索引贴
  14. 基金投资理财专栏介绍
  15. 交互设计师眼中的需求分析
  16. Sort of sort
  17. 小程序绑定手机,发送验证码
  18. 初入python世界——python基础语法
  19. Linux系统下服务和运行目标管理——单用户和多用户模式的切换
  20. 极客时间和极客学院_极客奔跑

热门文章

  1. 电商平台常用技术汇总
  2. 猫猫学iOS之安装cocoapods
  3. 凝思磐石安全操作系统官方版 下载
  4. 小飞鱼通达二开 企业微信与通达OA的另一种集成方式(图文)
  5. 晋江一中2021高考成绩查询,2019高考成绩出炉,晋江第一名揭晓!
  6. 问道服务器etc修改教程,问道自定义宠物etc写法教程
  7. (一)云计算技术学习--基础概念
  8. 【Bug】AttributeError: module ‘gast‘ has no attribute ‘Index‘
  9. 三国杀显示服务器登录错误,三国杀登录超时怎么办?登陆失败解决方法[多图]...
  10. 基于双目相机的图像深度信息提取算法matlab仿真