在Python应用正则表达式

原文地址

在python中,可以用string.startwith()、string.endswith()、if string in sentence等等进行字符匹配,但能完成的匹配有限,

正则表达式是用来完成精确匹配的一种机制

在各种语言中通用

正则表达式能够更有效的处理字符串方法处理起来很复杂的匹配

——书籍《正则指引》Python写的

  • 规则

    • []表示一个位置,[123]表示这一个位置或1或2或3

    • [0123456789] [0-9] [a-z] [0-9a-fA-F] 必须是-前大,-后小

    • 元字符——就是在正则表达式中有特殊的意义

      元字符 匹配内容
      . 匹配除换行符以外的任意字符
      \w 匹配字母或数字或下划线
      \s 匹配任意的空白符
      \d 匹配数字
      \n 匹配一个换行符
      \t 匹配一个制表符
      \b 匹配一个单词的结尾
      ^ 匹配字符串的开始
      $ 匹配字符串的结尾
      \W 匹配非字母或数字或下划线
      \D 匹配非数字
      \S 匹配非空白符
    • 重复匹配

      • *? 重复任意次,但尽可能少重复
      • +? 重复1次或更多次,但尽可能少重复
      • ?? 重复0次或1次,但尽可能少重复
      • {n,m}? 重复n到m次,但尽可能少重复
      • {n,}? 重复n次以上,但尽可能少重复
    • .*?

      • 只对前面紧跟的一个字符起作用
      • . 是任意字符
      • 是取 0 至 无限长度(贪婪匹配,尽可能多的匹配)
      • ? 是非贪婪模式(尽可能短的匹配)
      • 合在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在 .*?x 就是取前面任意长度的字符,直到一个x出现
    • 分组匹配

      () 在总的匹配串中获得其中的部分内容

  • 方法

    • search(restr, string),在string中匹配符合restr的部分;返回一个re内部的对象

      search(restr, string).group(),获得匹配命中的字符子串

    #----------------- 直接匹配
    pattern1 = "cat"    # 匹配其中的cat
    pattern2 = "bird"
    string = "dog runs to cat"
    print(re.search(pattern1, string))
    # <_sre.SRE_Match object; span=(12, 15), match='cat'>
    print(re.search(pattern1, string).group())
    # cat
    print(re.search(pattern2, string))
    # None
    
    #------------------ 拼接匹配
    ptn3 = r"r[au]n"  # 匹配 ("run" or "ran")
    ptn4 = r'r[a-c]n'   # 匹配ran、rbn、rcn
    print(re.search(ptn3, "dog runs to cat"))
    # <_sre.SRE_Match object; span=(4, 7), match='run'>
    print(re.search(ptn4, "dog runs to cat"))
    # None
    
    #------------------- 元字符
    print(re.search(r"r\dn", "run r4n"))    # \d匹配一位数字
    # <_sre.SRE_Match object; span=(4, 7), match='r4n'>
    print(re.search(r"r\Dn", "run r4n"))    # \D匹配一位非数字
    # <_sre.SRE_Match object; span=(0, 3), match='run'>
    
    #------------------- 多行匹配
    string = '''
    dog runs to cat.
    I run to dog.
    '''
    print(re.search(r"^I", string))
    # None
    print(re.search(r"^I", string, flags=re.M))     # 通过指定flags属性为re.M可以在多行进行匹配
    # <_sre.SRE_Match object; span=(18, 19), match='I'>
    
    #-------------------- 重复匹配
    # * : 重复零次或多次
    # + : 重复一次或多次
    # {n, m} : 重复 n 至 m 次
    # {n} : 重复 n 次
    
    # *:匹配0次或多次,尽可能多的匹配
    print(re.search(r"ab*", "a"))   # 允许0个b
    # <_sre.SRE_Match object; span=(0, 1), match='a'>
    print(re.search(r"ab*", "abbbbb"))      # *对b起作用,即0或多个b,尽可能多的匹配
    # <_sre.SRE_Match object; span=(0, 6), match='abbbbb'>
    
    # + : 匹配1次或多次,尽可能多匹配
    print(re.search(r"ab+", "a"))   # 要求至少有1个b
    # None
    print(re.search(r"ab+", "abbbbb"))
    # <_sre.SRE_Match object; span=(0, 6), match='abbbbb'>
    
    # {n, m} : 匹配n-m次,尽可能多匹配
    print(re.search(r"ab{2,10}", "a"))
    # None
    print(re.search(r"ab{2,10}", "abbbbbabb"))
    # <_sre.SRE_Match object; span=(0, 6), match='abbbbb'>
    
    #------------------- 分组匹配
    # 通过在小括号()中一部分匹配规则,这样可以在匹配结果中通过索引单独提取这部分结果
    match = re.search(r"(\d+), Date: (.+)", "ID: 021523, Date: Feb/12/2017")
    print(match.group())    # 获取整个匹配结果
    # 021523, Date: Feb/12/2017
    print(match.group(1))   # 提取索引1的结果(第1个括号),索引从1开始
    # 021523
    print(match.group(2))   # 提取索引2的结果(第2个括号)
    # Date: Feb/12/2017
    
    # 通过?P<名称>可以为匹配结果指定key/名称/属性索引,可以在结果中通过这么名称访问分组匹配结果
    match = re.search(r"(?P<id>\d+), Date: (?P<date>.+)", "ID: 021523, Date: Feb/12/2017")
    print(match.group('id'))
    # 021523
    print(match.group('date'))
    # Date: Feb/12/2017
    
    • re.findall(restr,string),返回string中所有匹配restr的结果列表
    print(re.findall(r"r[ua]n", "run ran ren"))
    # ['run', 'ran']
    
    • | : or 匹配xx或者XX
    print(re.findall(r"(run|ran)", "run ran ren"))
    # ['run', 'ran']
    
    • re.sub(restr,replacestr,string) 匹配并替换string中的restr为replacestr
    print(re.sub(r"r[au]ns", "catches", "dog runs to cat"))
    # dog catches to cat
    
    • re.split(restr, string) 按restr对string进行分割,返回分割后的列表
    print(re.split(r'[,;\.]', 'a;b,c.d;e'))     # 按匹配到的字符进行分割
    # ['a', 'b', 'c', 'd', 'e']
    
    • re.compile(restr) 将正则表达式封装进compile对象
    compiled_re = re.compile(r"r[ua]n")     # 把正则规则封装进一个正则对象
    print(compiled_re.search("dog ran to cat")) # 在字符串上应用正则对象
    # <_sre.SRE_Match object; span=(4, 7), match='ran'>
    
  • 查询文档

pyre

引自 Python正则表达式指南

  • 参考文献

程序主要来自 Python正则表达式指南,略有改动
python之路——常用模块

发布了147 篇原创文章 · 获赞 142 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/BBJG_001/article/details/104625321
今日推荐