1. 基本知识
字符串是编程时涉及到的最多的一种数据结构。正则表达式正是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性语言来给字符串定义一个规则,用来验证是否匹配。
2. 进阶知识
[0-9a-zA-Z_] : 可以匹配一个数字、字母、下划线;
[0-9a-zA-Z_]+ : 可以匹配至少由一个数字、字母、下划线组成的字符串;
[a-zA-Z_] [0-9a-zA-Z_] : 可以匹配由字母数字下划线开头,后面至少由一个数字、字母、下划线组成的字符串,即: Python的合法变量;
(P|p)ython : 表示Python 或 python
^: 开始符,表示行的开头
$: 结束符,表示行的结束
3. re模块
Python提供re模块,包含了所有正则表达式的功能
1 2 3 4 5
| >>> import re >>> re.match(r'^\d{3}\-\d{3,8}', '010-12345') <re.Match object; span=(0, 9), match='010-12345'> >>> re.match(r'^\d{3}\-\d{3,8}', '010 12345') >>>
|
常见应用
1 2 3 4 5
| test = '用户输入的字符串' if re.match(r'正则表达式', test): print('ok') else: print('failed')
|
4. 切分字符串
1 2 3 4 5 6
| >>> 'a b c'.split(' ') ['a', 'b', '', '', 'c'] >>> re.split(r'\s+', 'a b c') ['a', 'b', 'c'] >>> re.split(r'[\s\,]+', 'a,b c d') ['a', 'b', 'c', 'd']
|
5. 分组
正则表达式还具有提取子串的强大功能。()表示要提取的Group。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| >>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345') >>> m <re.Match object; span=(0, 9), match='010-12345'> >>> m.group(0) '010-12345' >>> m.group(1) '010' >>> m.group(2) '12345' >>> m.group() '010-12345' >>> m.groups() ('010', '12345')
|
6. 贪婪匹配
正则表达式会尽可能多的匹配字符
1 2 3 4
| >>> re.match(r'^(\d+)(0*)$', '102300').groups() ('102300', '') >>> re.match(r'^(\d+?)(0*)$', '102300').groups() ('1023', '00')
|
7. 编译
当需要大量重复的使用正则表达式时,可以采用预编译方式,提升效率
1 2 3 4 5 6 7
| >>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$') >>> re_telephone.match('010-12345').groups() ('010', '12345') >>> re_telephone.match('010 12345').groups() Traceback (most recent call last): File "<input>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'groups'
|