正则表达式——5.MatchObject对象、sub()方法

1.re.match()

目前已经学习了搜寻字符串中最重要的2个方法re.search()和re.findall(),re模块另一个方法是re.match(),这个方法其实和re.match()相同,差异是re.match()只搜寻比对字符串开始的字符,如果失败就算失败,re.search()则是搜寻整个字符串。至于re.match()搜寻成功会回传MatchObject对象,若是搜寻失败会回传None,这部分与re.search()相同。

re.match()的应用:测试1是将John放在被搜寻字符串的最前面,测试2没有将John放在被搜寻字符串的最前面。

import re

# 测试1搜寻使用re.match()
msg1 = 'John will attend my party tonight.'  # John是第一个字符串
pattern = 'John'
txt1 = re.match(pattern, msg1)
if txt1 != None:
    print("测试1输出: ", txt1.group())
else:
    print("测试1搜寻失败")

# 测试2搜寻使用re.match()
msg2 = 'My best friend is John.'  # John不是第一个字符串
txt2 = re.match(pattern, msg2, re.DOTALL)
if txt2 != None:
    print("测试2输出: ", txt2.group())
else:
    print("测试2搜寻失败")

2.MatchObject几个重要的方法

当使用re.search()或re.match()搜寻成功时,会产生MatchObject对象。

通过一个实例来看看MatchObject对象是什么。

import re

# 测试1搜寻使用re.match()
msg = 'John will attend my party tonight.'
pattern = 'John'
txt1 = re.match(pattern, msg)
if txt1 != None:
    print("使用re.match()输出MatchObject对象: ", txt1)
else:
    print("测试1搜寻失败")

# 测试1搜寻使用re.search()
txt2 = re.search(pattern, msg)
if txt2 != None:
    print("使用re.search()输出MatchObject对象: ", txt2)
else:
    print("测试1搜寻失败")

从上述可知,当使用re.match()和re.search()皆搜寻成功时,两者的MatchObject对象内容是相同的。span是注明成功搜寻字符串的起始位置和结束位置。从此处可以知道起始索引位置是0,结束索引位置是4。match则是注明成功成功搜寻的字符串内容。

 取得MatchObject对象内容的重要方法:

方法说明
group()可回传搜寻到的字符串,本章已有许多实例说明
end()可回传搜寻到的字符串的结束位置
start()可回传搜寻到的字符串的起始位置
span()可回传搜寻到的字符串的(起始,结束)位置
import re

# 测试1搜寻使用re.match()
msg1 = 'John will attend my party tonight.'
pattern = 'John'
txt1 = re.match(pattern, msg1)
if txt1 != None:
    print("搜寻成功字符串的起始索引位置: ", txt1.start())
    print("搜寻成功字符串的结束索引位置: ", txt1.end())
    print("搜寻成功字符串的起始索引位置: ", txt1.span())

# 测试2搜寻使用re.search()
msg2 = 'My best friend is John.'
txt2 = re.search(pattern, msg2)
if txt2 != None:
    print("搜寻成功字符串的起始索引位置: ", txt2.start())
    print("搜寻成功字符串的结束索引位置: ", txt2.end())
    print("搜寻成功字符串的结束索引位置: ", txt2.span())

 

 3.抢救CIA情报员——sub()方法

Python re模块内的sub()方法可以用新的字符串取代原本字符串的内容。

sub()方法的基本使用语法如下:

result = re.sub(pattern, newstr, msg)  # msg是整个欲处理的字符串或句子

pattern是欲搜寻的字符串,如果搜寻成功则用newstr取代,同时成功取代的结果回传给result变量,如果搜寻到多个相同字符串,这些字符串将全部被取代,须留意原先msg内容将不会改变。

字符串取代的应用实例:测试1是发现2个字符串被成功取代,同时列出取代结果。测试2是取代失败,所以txt与原msg内容相同。

import re

# 测试1取代使用re.sub()结果成功
msg = 'Eli Nan will attend my party tonight. My best friend is Eli Nan.'
pattern = 'Eli Nan'  # 欲搜寻的字符串
newstr = 'Kevin Thomson'  # 新字符串
txt = re.sub(pattern, newstr, msg)
if txt != msg:  # 如果txt与msg内容不同表示取代成功
    print("取代成功: ", txt)
else:
    print("取代失败: ", txt)  # 列出失败的取代结果

# 测试2取代使用re.sub()结果失败
pattern = 'Eli Thomson'  # 欲搜寻的字符串
txt = re.sub(pattern, newstr, msg)
if txt != msg:  # 如果txt与msg内容不同表示取代成功
    print("取代成功: ", txt)
else:
    print("取代失败: ", txt)

 例如,情报机构在内部文件不可直接将情报员的名字列出来,历史上太多这类实例造成情报员的牺牲,这时可以用*** 代替原本的姓名。使用Python的正则表示法,可以轻松协助我们执行这方面的工作。

将CIA情报员名字用名字第一个字母和***取代。

import re

# 使用隐藏文字执行取代
msg = 'CIA Mark told CIA Linda that secret USB had given to CIA Peter.'
pattern = r'CIA (\w)\w*'  # 欲搜寻CIA + 空一格后的名字
newstr = r'\1***'  # 新字符串使用隐藏文字
txt = re.sub(pattern, newstr, msg)
print("取代成功: ", txt)

 

pattern = r'CIA (\w)\w*'  # 欲搜寻CIA + 空一格后的名字

 (\w)代表必须只有一个字符,同时小括号代表这是一个分组(group),由于整行只有一个括号所以知道这是第一分组,同时只有一个分组,括号外的\w*表示可以有0到多个字符。所以(\w)\w*相当于是1到多个字符组成的单词,同时存在分组1.

newstr = r'\1***'  # 新字符串使用隐藏文字

\1代表用分组1找到的第一个字母当作字符串开头,后面*** 则是接在第一个字母后面的字符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨小古

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值