• 正则表达式——4.贪婪与非贪婪搜寻、特殊字符


    1.搜寻时使用大括号设定比对次数

    正则表达式——2.正则表达式的基础_笨小古的博客-CSDN博客中已使用过大括号,大括号的数字设定的是重复次数。

    将这个概念应用在搜寻一般字符串,例如,(son){3}代表所搜寻的字符串是'sonsonson',如果有一字符串是'sonson',则搜寻结果是不符。大括号除了可以设定重复次数,也可以设定指定范围,例如,(son){3, 5}代表所搜寻的字符串如果是'sonsonson' 'sonsonsonson'或'sonsonsonsonsonson'都算是相符合的字符串。(son){3, 5}正则表达式相当于下列表达式:

    ((son)(son)(son)) | ((son)(son)(son)(son)) | ((son)(son)(son)(son)(son)(son))

    设定搜寻son字符串重复3~5次皆算搜寻成功。

    1. # 贪婪与非贪婪搜寻
    2. import re
    3. def searchStr(pattern, msg):
    4. txt = re.search(pattern, msg)
    5. if txt == None: # 搜寻失败
    6. print("搜寻失败", txt)
    7. else:
    8. print("搜寻成功", txt.group())
    9. msg1 = 'son'
    10. msg2 = 'sonson'
    11. msg3 = 'sonsonson'
    12. msg4 = 'sonsonsonson'
    13. msg5 = 'sonsonsonsonson'
    14. pattern = '(son){3,5}'
    15. searchStr(pattern, msg1)
    16. searchStr(pattern, msg2)
    17. searchStr(pattern, msg3)
    18. searchStr(pattern, msg4)
    19. searchStr(pattern, msg5)

     

    使用大括号时,也可以省略第一或第二个数字,这相当于不设定最小或最大重复次数。例如:(son){3,}代表重复3次以上皆符合,(son){10,}代表重复10次以下皆符合。

    2.贪婪与非贪婪搜寻

    在讲解贪婪与非贪婪搜寻前,先简化上例,使用相同的搜寻模式'(son){3,5})' ,搜寻字符串是'sonsonsonsonson'。

    1. # 贪婪与非贪婪搜寻
    2. import re
    3. def searchStr(pattern, msg):
    4. txt = re.search(pattern, msg)
    5. if txt == None: # 搜寻失败
    6. print("搜寻失败", txt)
    7. else:
    8. print("搜寻成功", txt.group())
    9. msg = 'sonsonsonsonson'
    10. pattern = '(son){3,5}'
    11. searchStr(pattern, msg)

     结果:

     其实由上述程序所设定的搜寻模式可知3、4、5个son重复就算找到了,但是在Python里面执行结果是列出了最多重复的字符串,5次重复,这是Python的默认模式,这种模式又称贪婪(greedy)模式。

    另一种是列出最少重复的字符串,以这个实例而言是重复3次,这称为贪婪模式,方法是在正则表达式的搜寻模式右边增加问号。

    以非贪婪模式设计以上程序。

    1. # 与上例代码不同的是
    2. pattern = '(son){3,5}?'

     

     3.特殊字符表

    特殊字符表
    字符使用说明
    \d0~9的整数字元
    \D除了0~9的整数字元以外的其他字符
    \s空白、定位、Tab键、换行、换页字符
    \S除了空白、定位、Tab键、换行、换页字符以外的字符
    \w数字、字母和下划线_字符,[A-Za-z0-9_]
    \W除了数字、字母和下划线_字符,[A-Za-z0-9_]以外的其他字符

    下面用实例说明上述表格概念的正则表达式的使用。

    将一段英文句子的单词分离,同时将英文单词前4个字母是"John"的单词筛选出来。

    1. pattern = '\w+' # 意见是把不限长度的数字、字母和下划线当作符合搜寻
    2. pattern = 'John\w' # John开头后面接0~多个数字、字母和下划线字符
    1. import re
    2. # 测试1将字符串从句子分离
    3. msg1 = 'John, Johnson, Johnnason and Johnnathan will attend my party tonight.'
    4. pattern1 = '\w+' # 不限字符的单字
    5. txt1 = re.findall(pattern1, msg1) # 回传搜寻的结果
    6. print(txt1)
    7. # 测试2将John开始的字符串分离
    8. msg2 = 'John, Johnson, Johnnason and Johnnathan will attend my party tonight.'
    9. pattern2 = 'John\w' # John开头的单词
    10. txt2 = re.findall(pattern2, msg2)
    11. print(txt2)

     继续展示正则表达式的应用,下列程序重点是第5行。

    1. \d+: 表示不限长度的数字。
    2. \s: 表示空格。
    3. \w+: 表示不限长度的数字、字母和下划线字符连续字符。
    1. import re
    2. msg = '1 cat, 2 dogs, 3 pigs, 4 swans'
    3. pattern = '\d+\s\w+'
    4. txt = re.findall(pattern, msg)
    5. print(txt)

     4.字符分类

    Python可以使用中括号来设定字符,可参考下列实例。

    [a-z]: 代表a~z的小写字符。

    [A~Z]: 代表A~Z的大写字符。

    [aeiouAEIOU]: 代表英文发音的元音字符。

    [2-5]: 代表2~5的数字。

    在字符分类中,中括号内可以不同放上正则表示法的发斜杠\执行 .、?、*、(、)等字符的转译。例如,[2-5.]会搜寻2~5的数字和句点,这个语法不用写成[2-5\.]。

    下面看一个搜寻字符的应用实例,首先将搜寻[aeiouAEIOU],然后将搜寻[2-5.]。

    1. import re
    2. # 测试1搜寻[aeiouAEIOU]
    3. msg1 = 'John, Johnson, Johnnason and Johnnathan will attend my party tonight.'
    4. pattern1 = '[aeiouAEIOU]'
    5. txt1 = re.findall(pattern1, msg1)
    6. print(txt1)
    7. # 测试2搜寻[2-5.]字符
    8. msg2 = '1. cat, 2. dogs, 3. pigs, 4. swans'
    9. pattern2 = '[2-5.]'
    10. txt2 = re.findall(pattern2, msg2)
    11. print(txt2)


     
    5.所有字符使用通配符“.*” 

    字符" . " 与 " * "组合,可以搜寻所有的字符,意义是搜寻0到多个通配符(换行字符除外)。

    搜寻所有字符" .* "的组合应用。

    1. import re
    2. msg = 'Name: Jiin-Kweo Hung Address: 8F, Nan-Jing E, Rd, Taipei'
    3. pattern = 'Name: (.*) Address: (.*)'
    4. txt = re.search(pattern, msg)
    5. Name, Address = txt.groups()
    6. print("Name: ", Name)
    7. print("Address: ", Address)

     6.换行字符的处理 

    使用知识点5中的概念用" .* " 搜寻时碰上换行字符,搜寻就会停止。Python的re模块提供参数re.DOTALL,功能时包括搜寻换行字符,可以将参数放在search()、findall()或compile()。

    实例6:测试1是搜寻除换行符以外的字符,测试2是搜寻含换行字符的所有字符。由于测试2包含换行字符,所以输出时,换行字符主导2行输出。

    1. import re
    2. # 测试1搜寻除换行字符以外的字符
    3. msg1 = 'Name: Jiin-Kweo Hung \nAddress: 8F, Nan-Jing E, Rd, Taipei'
    4. pattern1 = '.*'
    5. txt1 = re.search(pattern1, msg1)
    6. print("测试1输出:", txt1.group())
    7. # 测试2搜寻包括换行字符
    8. msg2 = 'Name: Jiin-Kweo Hung Address: 8F, Nan-Jing E, Rd, Taipei'
    9. pattern2 = '.*'
    10. txt2 = re.search(pattern2, msg2, re.DOTALL)
    11. print("测试2输出:", txt2.group())

     另外还有:

    字符分类的^字符;(在中括号内的左方加上^字符,是指搜寻不在这些字符内的所有字符)

    正则表示法的^字符;(与字符分类的^字符完全相同但是用法不同:在起始位置加上^字符,表示正则表示法的字符串必须出现在被搜寻字符串的起始位置,这样搜寻成功才算成功)

    正则表示法的$字符;(正则表示法的末端放置$字符时,表示正则表示法的字符串必须出现在被搜寻字符串的最后位置,这样搜寻成功才算成功)

    单一字符使用通配符".";(通配符" . "表示可以搜寻除了换行字符以外的所有字符,但是只限定一个字符)

  • 相关阅读:
    Dubbo原理解析,彻底搞懂dubbo (下)
    数据治理之关键环节元数据管理开源项目datahub探索
    【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)
    打家劫舍3(二叉树型)Java
    嵌入式Linux驱动开发(LCD屏幕专题)(三)
    实施OKR过程中需要注意的7个事项,尤其是第2个!
    区块链Layer 1与Layer 2扩展解决方案
    ROS1云课→19仿真turtlebot(stage)
    一文打尽知识图谱(超级干货,建议收藏!)
    【Java】怎么处理Oracle的Clob类型字段
  • 原文地址:https://blog.csdn.net/weixin_51995147/article/details/126253270