资讯专栏INFORMATION COLUMN

在Python中查找和替换文本

B0B0 / 1493人阅读

摘要:最简单的查找替换在中查找和替换非常简单,如果当前对象是一个字符串时,你可以使用该类型提供的或者方法查找指定的字符,如果能找到则会返回字符第一次出现的索引,如果不存在则返回。下面是正则查找的简单示例。

最简单的查找替换

在Python中查找和替换非常简单,如果当前对象是一个字符串str时,你可以使用该类型提供的find()或者index()方法查找指定的字符,如果能找到则会返回字符第一次出现的索引,如果不存在则返回-1。

>>> s = "Cat and Dog"
>>> s.find("Dog")
8
>>> s.index("Dog")
8
>>> s.find("Duck")
-1

如果要替换目标字符串,用replace()方法就好了。

>>> s = "Cat and Dog"
>>> s.replace("Cat", "Dog")
"Dog and Dog"
通配符查找匹配

当然,如果你觉得上面的功能还不能满足你,你想使用通配符来查找字符串?没问题!fnmatch这个库就能满足你的要求,看例子!

>>> s = "Cat and Dog"
>>> import fnmatch
>>> fnmatch.fnmatch(s,"Cat*")
True
>>> fnmatch.fnmatch(s,"C*and*D?")
False
>>> fnmatch.fnmatch(s,"C*and*D*")
True
正则表达式查找替换

如果你需要查找比较复杂的字符规则,正则表达式是你不二的选择。下面是正则查找的简单示例。

>>> import re
>>> s = "We will fly to Thailand on 2016/10/31"
>>> pattern = r"d+"
>>> re.findall(pattern, s)
["2016", "10", "31"]
>>> re.search(pattern, s)
<_sre.SRE_Match object at 0x03A8FD40>
>>> re.search(pattern, s).group()
"2016"

接下来你可能需要用正则表达式去替换某些字符,那么你需要了解re.sub()方法,看例子。

>>> s = "I like {color} car."
>>> re.sub(r"{color}","blue",s)
"I like blue car."

>>> s = "We will fly to Thailand on 10/31/2016"
>>> re.sub("(d+)/(d+)/(d+)", r"3-1-2", s)
"We will fly to Thailand on 2016-10-31"

其实re.sub()远比你相像的强大的多。在上面的例子里你可以替换类似于{color}这样的模板字符,也可以把正则匹配到的所有分组调换顺序,例如第二个例子一共匹配了3个分组,然后把第3个分组放到最前面 r"3-1-2",看明白了吗?

接下来看另外一个例子。

s = "Tom is talking to Jerry."
name1 = "Tom"
name2 = "Jerry"

pattern = r"(.*)({0})(.*)({1})(.*)".format(name1, name2)
print re.sub(pattern, r"14325", s)
# Jerry is talking to Tom.

其实你还可以自定义替换函数,也就是re.sub()的第二个参数。

def change_date(m):
    from calendar import month_abbr
    mon_name = month_abbr[int(m.group(1))]
    return "{} {} {}".format(m.group(2), mon_name, m.group(3))

s = "We will fly to Thailand on 10/31/2016"
pattern = r"(d+)/(d+)/(d+)"
print re.sub(pattern, change_date, s)
# We will fly to Thailand on 31 Oct 2016

最后给大家一个终极版的例子,里面用到了函数的闭包,着酸爽,你懂的!

def match_case(word):
    def replace(m):
        text = m.group()
        if text.isupper():
            return word.upper()
        elif text.islower():
            return word.lower()
        elif text[0].isupper():
            return word.capitalize()
        else:
            return word
    return replace

s = "LOVE PYTHON, love python, Love Python"
print re.sub("python", match_case("money"), s, flags=re.IGNORECASE)
# LOVE MONEY, love money, Love Money
写在最后

其实正则表达式还有很多玩法,如果你想让正则和通配符混合着用,一点问题都没有,因为fnmatch还有一个translate()的方法,可以让你把通配符无痛转换成正则表达式,你爱怎么玩就怎么玩。

>>> fnmatch.translate("C*and*D*")
"C.*and.*D.*"

关于作者:Python技术爱好者,目前从事测试开发相关工作,转载请注明原文出处。

欢迎关注我的博客 http://betacat.online,你可以到我的公众号中去当吃瓜群众。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44234.html

相关文章

  • Python实用技法第24篇:正则:查找替换文本

    摘要:上一篇文章实用技法第篇正则文本模式的匹配和查找下一篇文章实用技法第篇正则以不区分大小写的方式对文本做查找和替换需求 上一篇文章:Python实用技法第23篇:正则:文本模式的匹配和查找下一篇文章:Python实用技法第25篇:正则:以不区分大小写的方式对文本做查找和替换 1、需求

    刘永祥 评论0 收藏0
  • Python实用技法第25篇:正则:以不区分大小写的方式对文本查找替换

    摘要:上一篇文章实用技法第篇正则查找和替换文本下一篇文章实用技法第篇定义实现最短匹配的正则表达式需求 上一篇文章:Python实用技法第24篇:正则:查找和替换文本下一篇文章:Python实用技法第26篇:定义实现最短匹配的正则表达式 1、需求

    darkbug 评论0 收藏0
  • Python 正则表达式 re 模块简明笔记

    摘要:假设现在想把字符串你好,,世界中的中文提取出来,可以这么做你好,,世界注意到,我们在正则表达式前面加上了两个前缀,其中表示使用原始字符串,表示是字符串。本文标题为正则表达式模块简明笔记本文链接为参考资料正则表达式 简介 正则表达式(regular expression)是可以匹配文本片段的模式。最简单的正则表达式就是普通字符串,可以匹配其自身。比如,正则表达式 hello 可以匹配字符...

    lastSeries 评论0 收藏0
  • Python的正则表达式

    摘要:正则表达式就是用来描述他称为正则集的代数的表达式,因此采用正则表达式这个术语。文本中正则表达式结束搜索的索引值与和方法的同名参数相同。对象是一个编号的正则表达式通过提供的一系列方法可以对文本进行匹配查找。 一、概述 今天这篇文章带领大家学习一下Python中的正则表达式,当然了,正则表达式本身的内容就足以写好几本书了,我们这里列出的内容,仅仅是Python中常用的和基础的一些内容。 那...

    Juven 评论0 收藏0
  • PythonPython正则表达式使用指导

    摘要:反斜杠的困扰与大多数编程语言相同,正则表达式里使用作为转义字符,这就可能造成反斜杠困扰。文本中正则表达式结束搜索的索引。以元组形式返回全部分组截获的字符串。用于指定最大分割次数,不指定将全部分割。 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法...

    nihao 评论0 收藏0

发表评论

0条评论

B0B0

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<