正则表达式

正则表达式是一种字符串验证的规则,通过特殊的字符串组合来确立规则,用规则去匹配字符串是否满足

match

匹配指定字符串的开头

判断 match 的第二个参数是不是以 python 开头,是就返回对应的信息,不是就返回 None

# 导入正则表达式包
import re

res = re.match("python", "python itheima")
print(res)
# <_sre.SRE_Match object; span=(0, 6), match='python'>

可以通过 spangroup 拿到匹配到的信息

print(res.span())  # 拿到匹配到的内容下标:(0, 6)
print(res.group())  # 拿到匹配到的内容:python

如果 python itheima 的首字符小写,那么正则表达式需要小写的 p

res = re.match("p", 'python itheima')
print(res.group())  # p

如果 python itheima 的首字符大写,那么正则表达式需要大写的 P

res = re.match('P', 'Python itheima')
print(res.group())  # P

我们可以这么写,使开头既可以是小写 p ,也可以是大写 P

import re

res = re.match("[pP]ython", "python itheima")
print(res)
# <_sre.SRE_Match object; span=(0, 6), match='python'>

注意 match 只会查找开头的第一个 p ,不会匹配到后面的

res = re.match("p", "python p")
print(res.span())  # (0, 1)

search

匹配指定的字符串,从前往后匹配查找,找到第一个后就返回,不会再向后查找了

res = re.search("python", "000 python 000")
print(res)
# <_sre.SRE_Match object; span=(4, 10), match='python'>

print(res.span())  # (4, 10)

findall

匹配整个字符串,找出全部匹配项,找不到就返回空数组,找到了就返回以数组形式的所有配置项

res = re.findall("p", "p python p")
print(res)
# ['p', 'p', 'p']

小结

match 从头开始匹配,匹配第一个命中项

search 全局匹配,匹配第一个命中项

findall 全局匹配,匹配全部命中项

单字符匹配

字符功能
.匹配任意一个字符 (除了 \n\. 匹配点本身)
[]匹配 [] 中列举的字符
\d匹配数字,既 0-9
\D匹配非数字
\s匹配空白、空格、Tab键
\S匹配非空白
\w匹配单词字符,如:a-zA-Z0-9_

匹配任意字符

注意:除了 \n\. 匹配点本身可以匹配任意字符

print(re.findall(r"py", "py1"))  # ['py']

print(re.findall(r"py.", "py123"))  # ['py1']
print(re.findall(r"py..", "py123"))  # ['py12']
print(re.findall(r"py...", "py1二③"))  # ['py1二③']

匹配数字

print(re.findall("\d+", "qw12e34as5d"))  # ['12', '34', '5']

匹配非数字

匹配所有不是数字字符

print(re.findall("\D+", "qw12e34as5d"))  # ['qw', 'e', 'as', 'd']

匹配空白 空格 Tab键

print(re.findall("\s+", "1   3 dd qe        9"))  # ['   ', ' ', ' ', '        ']

匹配非空白

只要不是空白的都能匹配到

print(re.findall("\w+", "1   3 dd qe      9"))  # ['1', '3', 'dd', 'qe', '9']

匹配单词字符

只匹配这些:a-zA-Z0-9_,特殊字符和空白无法匹配到

print(re.findall("\w+", "qwe123_ ..@  "))  # ['qwe123_']

匹配特殊字符

print(re.findall(r"\W", "Itheima1 @@Python !!666 ##Itccast8"))
# [' ', '@', '@', ' ', '!', '!', ' ', '#', '#']

自定义匹配规则

s = "Itheima1 @@Python !!666 ##Itccast8"

# 匹配s字符串中的所有小写
print(re.findall(r"[a-z]", s))
# ['t', 'h', 'e', 'i', 'm', 'a', 'y', 't', 'h', 'o', 'n', 't', 'c', 'c', 'a', 's', 't']

# 匹配所有大写
print(re.findall(r"[A-Z]", s))
# ['I', 'P', 'I']

# 匹配所有数字
print(re.findall(r"[0-9]", s))
# ['1', '6', '6', '6', '8']

# 匹配大于等于2小于等于6的数字
print(re.findall(r"[2-6]", s))

# 多个匹配
print(re.findall(r"[A-Z0-9]", s))
# ['I', '1', 'P', '6', '6', '6', 'I', '8']

数量匹配

字符功能
*匹配前一个规则的字符出现0至无数次
+匹配前一个规则的字符出现1至无数次
匹配前一个规则出现0次或1次
{m}匹配前一个规则的字符出现m次
{m,}匹配前一个规则的字符出现最少m次
{m,n}匹配前一个规则的字符出现m到n次

匹配前一个规则的字符出现 0 次至无数次

中间可以允许没有空格,或者无数个空格

print(re.findall(r"Hello\s*World", "HelloWorld"))  # ['HelloWorld']
print(re.findall(r"Hello\s*World", "Hello World"))  # ['Hello World']
print(re.findall(r"Hello\s*World", "Hello      World"))  # ['Hello      World']

匹配前一个规则的字符出现 1 次至无数次

中间至少要有一个空格

print(re.findall(r"Hello\s+World", "HelloWorld"))  # []
print(re.findall(r"Hello\s+World", "Hello World"))  # ['Hello World']
print(re.findall(r"Hello\s+World", "Hello        World"))  # ['Hello        World']

要求指定的字符串必须出现 3 次

print(re.findall(r"a{3}", "aaa")) # ['aaa']
print(re.findall(r"a{3}", "aa"))  # []

要求指定的字符串至少要出现 3 次

print(re.findall(r"a{3,}", "aaa"))  # ['aaa']
print(re.findall(r"a{3,}", "aa"))  # []

要求指定的字符串最少出现 3 次,最多出现 5 次

print(re.findall(r"a{3,5}", "aaa"))  # ['aaa']
print(re.findall(r"a{3,5}", "aaaaa"))  # ['aaaaa']
print(re.findall(r"a{3,5}", "aa1aaa2aaaaa3"))  # ['aaa', 'aaaaa']
print(re.findall(r"a{3,5}", "aa"))  # []

边界匹配

字符功能
^匹配字符串开头
$匹配字符串结尾
\b匹配一个单词的边界
\B匹配非单词边界

匹配字符串的开头

print(re.findall(r"^a", "abc"))  # ['a']
print(re.findall(r"^a", "bac"))  # []

匹配字符串的结尾

print(re.findall(r"a$", "cba"))  # ['a']
print(re.findall(r"a$", "abc"))  # []

匹配字符串的开头与结尾

print(re.findall(r"^a$", "a"))  # ['a']
print(re.findall(r"^a$", "ab"))  # []
print(re.findall(r"^a..a$", "abca"))  # ['abca']

分组匹配

字符功能
\ 匹配左右任意一个表达式
()将括号中字符作为一个分组

只匹配为 a 或 b 的字符串

print(re.findall(r"a|b", "a"))  # ['a']
print(re.findall(r"a|b", "b"))  # ['b']
print(re.findall(r"a|b", "c"))  # []

匹配所有 h1 标签里面的字符串

print(re.findall(r'<h1>(.*)<h1>', '<h1>Hello<h1>'))  # ['Hello']
print(re.findall(r'<h1>(.*)<h1>', '<h2>Hello<h2>'))  # []

匹配所有 h1 标签中为 Hello 的字符串

print(re.findall(r'<h1>(Hello)<h1>', '<h1>Hello<h1>'))  # ['Hello']
print(re.findall(r'<h1>(Python)<h1>', '<h1>Hello<h1>'))  # []

综合案例

匹配账号: 只能由字母、数字组成 并且 长度限制 6-10

print(re.findall(r"^[a-zA-Z0-9]{6,10}$", "YuYang1024"))
# ['YuYang1024']

匹配QQ号: 要求纯数字 5-11 位数 并且 第一位不为 0

print(re.findall(r"[1-9][0-9]{4,10}", "3311118881"))
# ['3311118881']

标签: 开发笔记

添加新评论