翼度科技»论坛 编程开发 python 查看内容

正则表达式

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
★ 正则表达式基本概念
  1. 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个 "规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑.
复制代码
★ 字符匹配


  • 单字符匹配

    字符功能.匹配任意1个字符(除了\n)[ ]匹配[ ]中列举的字符\d匹配数字,即0-9\D匹配非数字,即不是数字\s匹配空白,即 空格,tab键\S匹配非空白\w匹配单词字符,即a-z、A-Z、0-9、_\W匹配非单词字符
  • 多字符匹配

    字符功能*匹配前一个字符出现0次或者无限次,即可有可无+匹配前一个字符出现1次或者无限次,即至少有1次?匹配前一个字符出现1次或者0次,即要么有1次,要么没有{m} 匹配前一个字符出现m次{m,n}匹配前一个字符出现从m到n次
  • 匹配开头结尾

    字符功能^匹配字符串开头$匹配字符串结尾
  • 匹配分组

    字符功能|匹配左右任意一个表达式(ab)将括号中字符作为一个分组\num引用分组num匹配到的字符串(?P)分组起别名(?P=name)引用别名为name分组匹配到的字符串
  • 基本使用

    • 案例1
      1. import re
      2. ret = re.match("([^-]*)-(\d+)","010-12345678")
      3. print(ret.group())
      4. print(ret.group(1))
      5. print(ret.group(2))
      6. # 运行结果:
      7. '010-12345678'
      8. '010'
      9. '12345678'
      复制代码
    • 案例2
      1. import re
      2. labels = ["<html><h1>www.itcast.cn</h1></html>", "<html><h1>www.itcast.cn</h2></html>"]
      3. for label in labels:
      4.     ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
      5.     if ret:
      6.         print("%s 是符合要求的标签" % ret.group())
      7.     else:
      8.         print("%s 不符合要求" % label)
      9.    
      10. # 运行结果:
      11. <html><h1>www.itcast.cn</h1></html> 是符合要求的标签
      12. <html><h1>www.itcast.cn</h2></html> 不符合要求
      复制代码
    • 案例3
      1. import re
      2. ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")
      3. print(ret.group())
      4. # 运行结果:
      5. '<html><h1>www.itcast.cn</h1></html>'
      复制代码

★ re 高级用法


  • 语法规则

    • match(pattern,string): 匹配字符串的开头
      pattern: 正则表达式
      string: 要进行匹配的字符串
      返回一个匹配对象
    • search(pattern, string): 匹配字符串的任意位置
      pattern: 正则表达式
      string: 要进行匹配的字符串
      返回一个匹配对象
    • findall(pattern, string): 匹配所有符合条件的内容
      pattern: 正则表达式
      string:要进行匹配的字符串
      返回所有符合条件的内容的列表
    • sub(pattern, repl, string, count=0): 替换匹配到的内容
      pattern: 正则表达式
      repl:要替换成的内容
      string:要进行替换的字符串
      count:要替换的次数,默认为0,表示无限次
      返回替换后的字符串
    • split(pattern, string[,maxsplit]): 将匹配到的内容作为分割字符进行字符串的分割
      pattern:正则表达式
      string:要进行分割的字符串
      maxsplit:最大分割次数
      返回分割后的字符串列表

  • 案例演示

    • search 使用
      1. #coding=utf-8
      2. import re
      3. ret = re.search(r"\d+", "阅读次数为 9999")
      4. ret.group()
      5. 运行结果:
      6. '9999'
      复制代码
    • findall 使用
      1. #coding=utf-8
      2. import re
      3. ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
      4. print(ret)
      5. 运行结果:
      6. ['9999', '7890', '12345']
      复制代码
    • sub 使用
      1. #coding=utf-8
      2. eg1:
      3. import re
      4. ret = re.sub(r"\d+", '998', "python = 997")
      5. print(ret)
      6. 运行结果:
      7. python = 998
      8. eg2:
      9. #coding=utf-8
      10. import re
      11. def add(temp):
      12.     strNum = temp.group()
      13.     num = int(strNum) + 1
      14.     return str(num)
      15. ret = re.sub(r"\d+", add, "python = 997")
      16. print(ret)
      17. ret = re.sub(r"\d+", add, "python = 99")
      18. print(ret)
      19. 运行结果:
      20. python = 998
      21. python = 100
      复制代码

  • 贪婪与非贪婪

    • 基本概念
      1. Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
      2. 非贪婪则相反,总是尝试匹配尽可能少的字符。在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。
      复制代码
    • 案例演示
      1. >>> re.match(r"aa(\d+)","aa2343ddd").group(1)
      2. '2343'
      3. >>> re.match(r"aa(\d+?)","aa2343ddd").group(1)
      4. '2'
      5. >>> re.match(r"aa(\d+)ddd","aa2343ddd").group(1)
      6. '2343'
      7. >>> re.match(r"aa(\d+?)ddd","aa2343ddd").group(1)
      8. '2343'
      复制代码

  • r的作用

    • 使用演示
      1. >>> mm = "c:\\a\\b\\c"
      2. >>> mm
      3. 'c:\\a\\b\\c'
      4. >>> print(mm)
      5. c:\a\b\c
      6. >>> re.match("c:\\\",mm).group()
      7. 'c:\\'
      8. >>> ret = re.match("c:\\\",mm).group()
      9. >>> print(ret)
      10. c:\
      11. >>> ret = re.match("c:\\\\a",mm).group()
      12. >>> print(ret)
      13. c:\a
      14. >>> ret = re.match(r"c:\\a",mm).group()
      15. >>> print(ret)
      16. c:\a
      17. >>> ret = re.match(r"c:\a",mm).group()
      18. Traceback (most recent call last):
      19.   File "<stdin>", line 1, in <module>
      20. AttributeError: 'NoneType' object has no attribute 'group'
      21. >>>
      复制代码
    • 使用总结
      1. Python中字符串前面加上 r 表示原生字符串, 与大多数编程语言相同,正则表达式里使用""作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
      2. Python里的原生字符串很好地解决了这个问题,有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
      复制代码


来源:https://www.cnblogs.com/cs-songbai/p/18111014
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具