通过丰富的 Python
示例和实际应用场景,本文将深入讲解正则表达式的用法,让你在数据清洗和文本分析中游刃有余
匹配指定字符串的开头
判断 match
的第二个参数是不是以 python
开头,是就返回对应的信息,不是就返回 None
# 导入正则表达式包
import re
res = re.match("python", "python itheima")
print(res)
# <_sre.SRE_Match object; span=(0, 6), match='python'>
可以通过 span
或 group
拿到匹配到的信息
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)
匹配指定的字符串,从前往后匹配查找,找到第一个后就返回,不会再向后查找了
res = re.search("python", "000 python 000")
print(res)
# <_sre.SRE_Match object; span=(4, 10), match='python'>
print(res.span()) # (4, 10)
匹配整个字符串,找出全部匹配项,找不到就返回空数组,找到了就返回以数组形式的所有配置项
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-z 、A-Z 、0-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-z
、A-Z
、0-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']