1. 规则

1. 匹配字符

  1. . 匹配任意一个字符
  2. [] 匹配[]中列举的字符
  3. \d 匹配数字
  4. \D 匹配非数字
  5. \s 匹配空白
  6. \S 匹配非空白
  7. \w 匹配配单词(a-z, A-Z, 1-9)
  8. \W 匹配非单词

2. 匹配数量

  • 匹配前一个字符出现0到多次
  • 匹配前一个字符至少出现一次
  1. ? 匹配前一个字符出现0次或者1次,(要么一次, 要么没有) # 注意: 如果?前面是跟的数量,则是取消贪婪
  2. {m} 匹配前一个字符出现m次, 出现
  3. {m,} 匹配前一个字符至少出现m次, 至少出现
  4. {m, n} 匹配前一个字符出现 m到n次

4. 匹配分组

  1. | 匹配左右任意一个表达式
  2. (ab) 将括号中字符作为一个分组
  3. \num 引用分组num匹配到的字符串
  4. (?) 分组起别名
  5. (?P=name) 引用别名为name分组匹配到的字符串

3. 匹配边界

  1. ^ 匹配开头
  2. $ 匹配结尾
  3. \b 匹配单词边界
  4. \B 匹配非单词边界

4. re模块中的匹配方法

  1. match: 尝试从字符串的起始位置匹配一个模式, 匹配成功返回的是一个匹配对象(这个对象包含了我们匹配的信息), 如果不是起始位置匹配成功的话, match()返回的是空 (只匹配一个)
  2. search: 扫描整个字符串, 匹配成功返回的是一个匹配对象 (search也只能匹配到一个, 找到符合规则的就返回, 不会一直往后找) (与match,类似, 但search查找整个字符串)
  3. findall: 在字符串中找到正则表达式所匹配的所有子串, 并返回一个列表,如果没有找到匹配的, 则返回一个空列表
import re
# re.match()    # match方法,本身就是从开头处开始匹配, 所以说加不加 ^(从头开始匹配) 没有什么影响
res = re.match(r'1[345678]\d{9}', '14777583048')     # 匹配电话号码

res = re.match(r'[1, 9]\d?$|1$|100$', '')    # 匹配0到100 , 并且不能以0开头
res = re.match(r'[1, 9]?\d?$|100$', '')    # 改进, 把0整合进前面的匹配过程中

# 匹配邮箱
p = r'(\w+)@(qq|163|126)\.(com|cn|net))'    # 匹配规则
res = re.match(p, '1284662736@qq.com')
print(res.group())    # 1284662736@qq.com

# 2. match
res3 = re.match(r'python', 'ipython')
print(res3)     # None


# 3. search
res4 = re.search(r'python', 'ipython')
print(res4)
print(res4.group())