# 正则

# 基本操作

  • ab 字符串ab
  • x|y x或y
  • \y 特殊字符y 比如 ^+{}$()[]|-?*

# 子母类

  • [a-d] a、b、c、d中的某个字符
  • [^a-d] 与上面相
  • [^(123|abc)] 匹配除了a、b、c 或者1、2、3这几个字符以外的任意字符
  • \d 一个数字字符
  • \D 一个非数字字符
  • \s 一个空白字符
  • \S 一个非空白字符
  • \w 一个字母数字字符
  • \W 一个非字母数字字符

# 数量相关

  • x* 0个或多个x
  • x+ 1个或多个x
  • x? 0个或1个x
  • x{2} 2个且仅2个x
  • x{2,5} 2-5个x

# 转义字符

  • \n 换行符
  • \r 回车符
  • \t tab

# 常用分组

# 捕获

  • (exp) 匹配exp,并捕获文本到自动命名的组里
  • (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
  • (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号

# 零宽断言

  • (?=exp) 匹配exp,前面的位置
  • (?<=exp) 匹配exp,后面的位置
  • (?!exp) 匹配后面跟的不是exp的位置
  • (?<!exp) 匹配前面不是exp的位置

# 懒惰限定

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

# Python的特殊匹配规则

  • \A 仅匹配字符串开头 \Aabc 结果 abc
  • \Z 仅匹配字符串末尾 abc\Z 结果 abc
  • (?P<name>) 分组,除了原有编号外指定一个额外的名字 (?P<word>abc){2} 结果 abcabc
# -*- coding:UTF-8 -*-

import re

def main():
    # 显示有Lenore或者Nevermore行。
    fh = open('raven.txt')
    for line in fh:
        if re.search('(Len|Neverm)ore', line):
            print(line, end='')
    fh.close()

    # 把所有匹配到的文本显示出来。
    fh = open('raven.txt')
    for line in fh:
        match = re.search('(Len|Neverm)ore', line)
        if match:
            print(match.group())
    fh.close()

    # 将行中所有Lenore或Nevermore 替换为###。
    # 替换1
    fh = open('raven.txt')
    for line in fh:
        print(re.sub('(Len|Neverm)ore', '###', line), end='')
    fh.close()
    # 替换2
    fh = open('raven.txt')
    for line in fh:
        match = re.search('(Len|Neverm)ore', line)
        if match:
            print(line.replace(match.group(), '###'), end='')
    fh.close()

    # 预编译正则
    fh = open('raven.txt')
    pattern = re.compile('(Len|Neverm)ore', re.IGNORECASE)  # 预编译
    for line in fh:
        if re.search(pattern, line):
            print(line, end='')  # 如果要替换可写成 print(pattern.sub('###', line), end='')
    fh.close()

if __name__ == "__main__":
    main()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
更新时间: 1/9/2020, 6:18:56 PM