• 正则表达式——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放在被搜寻字符串的最前面。

    1. import re
    2. # 测试1搜寻使用re.match()
    3. msg1 = 'John will attend my party tonight.' # John是第一个字符串
    4. pattern = 'John'
    5. txt1 = re.match(pattern, msg1)
    6. if txt1 != None:
    7. print("测试1输出: ", txt1.group())
    8. else:
    9. print("测试1搜寻失败")
    10. # 测试2搜寻使用re.match()
    11. msg2 = 'My best friend is John.' # John不是第一个字符串
    12. txt2 = re.match(pattern, msg2, re.DOTALL)
    13. if txt2 != None:
    14. print("测试2输出: ", txt2.group())
    15. else:
    16. print("测试2搜寻失败")

    2.MatchObject几个重要的方法

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

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

    1. import re
    2. # 测试1搜寻使用re.match()
    3. msg = 'John will attend my party tonight.'
    4. pattern = 'John'
    5. txt1 = re.match(pattern, msg)
    6. if txt1 != None:
    7. print("使用re.match()输出MatchObject对象: ", txt1)
    8. else:
    9. print("测试1搜寻失败")
    10. # 测试1搜寻使用re.search()
    11. txt2 = re.search(pattern, msg)
    12. if txt2 != None:
    13. print("使用re.search()输出MatchObject对象: ", txt2)
    14. else:
    15. print("测试1搜寻失败")

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

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

    方法说明
    group()可回传搜寻到的字符串,本章已有许多实例说明
    end()可回传搜寻到的字符串的结束位置
    start()可回传搜寻到的字符串的起始位置
    span()可回传搜寻到的字符串的(起始,结束)位置
    1. import re
    2. # 测试1搜寻使用re.match()
    3. msg1 = 'John will attend my party tonight.'
    4. pattern = 'John'
    5. txt1 = re.match(pattern, msg1)
    6. if txt1 != None:
    7. print("搜寻成功字符串的起始索引位置: ", txt1.start())
    8. print("搜寻成功字符串的结束索引位置: ", txt1.end())
    9. print("搜寻成功字符串的起始索引位置: ", txt1.span())
    10. # 测试2搜寻使用re.search()
    11. msg2 = 'My best friend is John.'
    12. txt2 = re.search(pattern, msg2)
    13. if txt2 != None:
    14. print("搜寻成功字符串的起始索引位置: ", txt2.start())
    15. print("搜寻成功字符串的结束索引位置: ", txt2.end())
    16. 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内容相同。

    1. import re
    2. # 测试1取代使用re.sub()结果成功
    3. msg = 'Eli Nan will attend my party tonight. My best friend is Eli Nan.'
    4. pattern = 'Eli Nan' # 欲搜寻的字符串
    5. newstr = 'Kevin Thomson' # 新字符串
    6. txt = re.sub(pattern, newstr, msg)
    7. if txt != msg: # 如果txt与msg内容不同表示取代成功
    8. print("取代成功: ", txt)
    9. else:
    10. print("取代失败: ", txt) # 列出失败的取代结果
    11. # 测试2取代使用re.sub()结果失败
    12. pattern = 'Eli Thomson' # 欲搜寻的字符串
    13. txt = re.sub(pattern, newstr, msg)
    14. if txt != msg: # 如果txt与msg内容不同表示取代成功
    15. print("取代成功: ", txt)
    16. else:
    17. print("取代失败: ", txt)

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

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

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

     

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

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

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

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

  • 相关阅读:
    python打包exe
    计算机操作系统 第三章:处理机调度与死锁(2)
    Linux安装node
    C++算法 通配符匹配
    详解kafka中的消息日志文件:Topic消息分类、partition分区、segment分段、offset偏移量索引文件
    【避坑】minio临时凭证STS实现上传,下载
    二、T100生产管理之工单开立与变更管理
    私家车位上海商学院
    喜马拉雅后端一面
    途虎养车上市、京东养车“震虎”,如何突围汽车后市场?
  • 原文地址:https://blog.csdn.net/weixin_51995147/article/details/126255840