本系列是学习 廖雪峰 Python3 教程 过程中记录的笔记,本篇文章记录 Python
中的 正则表达式的用法,主要包括基础匹配规则、进阶匹配规则,re
模块的基本使用,通过后面的练习题发现,还是得多练,只能看会一些基本的表达式。
正则表达式
- 用一种描述性的语言来给 字符串 定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的;
匹配规则
符号 | 含义 |
---|---|
\d | 一个数字 |
\w | 一个数字 或 字母 |
. | 任意一个字符 |
* | 任意个字符(包括0个) |
+ | 至少一个字符 |
? | 0个 或 1个 字符 |
{n} | n个 字符 |
{n, m} | n–m 个字符 |
\s | 一个空格(包括Tab) |
\s+ | 至少一个空格 |
‘\’ | 转义字符,用来表示特殊字符 |
\d{3}\-\d{3,8} | 表示形如 010-12345678 的电话号码 |
进阶
符号 | 含义 |
---|---|
[0-9a-zA-Z\_] | 一个数字、字母或者下划线 |
[0-9a-zA-Z\_]+ | 至少由一个数字、字母或者下划线组成的字符串 |
[a-zA-Z\_][0-9a-zA-Z\_]* | 由字母或下划线开头,后接任意个由数字、字母或者下划线组成的字符串 |
A|B | 匹配 A 或 B |
^\d | 以数字开头 |
\d$ | 以数字结尾 |
^py$ | 只能整行匹配 py |
re 模块
-
切分:使用
re.split()
函数可以将复杂的规则用于字符串划分;import re print(re.split(r'[\s\,]+', 'a,b, c d')) print(re.split(r'[\s\,\;]+', 'a,b;; c d')) output———————————————— ['a', 'b', 'c', 'd'] ['a', 'b', 'c', 'd']
-
分组:正则表达式中使用
()
可以将多个匹配字段分别匹配且分好组;import re m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345') print(m.group(0), m.group(1), m.group(2)) output————————————————— 010-12345 010 12345
-
贪婪匹配:正则表达式中使用诸如
+
等符号,它会贪婪地去匹配尽可能多的字符;import re print(re.match(r'^(\d+)(0*)$', '102300').groups()) # 加个 ? 就可以让 \d+ 采用非贪婪匹配: print(re.match(r'^(\d+?)(0*)$', '102300').groups()) output———————————————————— ('102300', '') ('1023', '00')
-
编译:预先把正则表达式编译好,频繁匹配的情况下,可以节省大量的时间;
import re re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$') print(re_telephone.match('010-12345').groups()) print(re_telephone.match('010-8086').groups()) output————————————————————— ('010', '12345') ('010', '8086')
练习题
'''is_valid_email() 验证电子邮件字符串是否合法'''
'''name_of_email() 提取合法的电子邮件的邮件名'''
import re
def is_valid_email(addr):
# 注意匹配 . 时需要使用 \ 转义
if re.match(r'[a-zA-Z][\w\.]*@[a-zA-Z0-9]+\.com', addr):
return True
else:
return False
def name_of_email(addr):
# .*? 用来匹配任意字符开头的字符串,且字符串长度允许为 0
# ([\w\s]+) 是将需要字符的用()提取,只将数字、字母、空格提取出来,长度至少为 1
return re.match(r'.*?([\w\s]+)', addr).group(1)
# 测试:
assert is_valid_email('someone@gmail.com')
assert is_valid_email('bill.gates@microsoft.com')
assert not is_valid_email('bob#example.com')
assert not is_valid_email('mr-bob@example.com')
print('ok')
# 测试:
assert name_of_email('<Tom Paris> tom@voyager.org') == 'Tom Paris'
assert name_of_email('tom@voyager.org') == 'tom'
print('ok')
output——————————————
ok
ok