import re

正则表达式,我的理解就是匹配文本中的pattern,那么这个过程可以分解为两个部分:
A. 定义自己需要的pattern
B. 用自己定义好的pattern在目标文本中进行匹配,然后对匹配到的对象进行操作

确定一个pattern,最主要的两个要点就是“匹配到什么字符”和“匹配到几次”

Part A. 定义pattern
1.匹配到什么字符
. 匹配除了\n 外所有的字符,DOTALL模式中也能匹配换行符
\ 转义字符
\d \D d数字0-9, D是除了d以外的
\s \S s是空白字符<空格>,\t\r\n\f\v S是除了s以外的
\w \W w是单词字符等效于[A-Za-z0-9_] W是除了w以外的
[]字符集,例如[1234asdf]

2.匹配到几次
{m} m次
{m,n} m,n次
* : {0, 无线}
+: {1, 无线}
?: {0,1}
*? or +? or ?? or{m,n}? 变成非贪婪模式

  1. 边界定义(不会真的匹配到字符,所以不会消耗字符串长度)
    ^abc 匹配字符串开头,多行模式匹配每行开头
    abc$ 匹配字符串结尾,多行模式匹配每行结尾
    \A 仅匹配字符串开头
    \Z 仅匹配字符串结果
    \b 匹配\w(单词字符)和\W(非单词字符)之间
    \B ^\b 【说实话我也不知道这个有什么用了,请大神指示】
  2. 分组
    abc|def 左右任意匹配一个
    (abc) 分组(编号)
    (?) 分组(别名) 用(?P=name)的方式引用
  3. 将表达式编译成Pattern对象
pattern=re.compile(r'expression')

re.I (Ingorecase)
re.M (Multiline多行模式)
re.S (DOTALL)
re.L (LOCALE) 本地模式
re.U (Unicode) unicode模式
re.X (Verbose) 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的:

a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")

Part B: 匹配及操作

match
search
split
findall 返回一个list
finditer 返回一个iterator(迭代器)
sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]):
使用repl替换string中每一个匹配的子串后返回替换后的字符串。
当repl是一个字符串时,可以使用\id或\g、\g引用分组,但不能使用编号0。
当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
count用于指定最多替换次数,不指定时全部替换。