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找到的第一个字母当作字符串开头,后面*** 则是接在第一个字母后面的字符。