- [x] 1.基本匹配表达式(\d\s*+…)
- [x] 2. re基本函数(re.match/re.search)
- [x] 3. 全解匹配表达式(一个大列表)
- [x] 4.切分字符串
- [x] 5.分组
- [x] 6.贪婪匹配
- [x] 7.编译
正则表达式是用来匹配字符串的终极武器
1.基本匹配表达式(\d\s*+…)
匹配值 | 表达式 |
---|---|
数字 | \d |
字母 | \w |
任意字符 | . |
空格 | \s |
Tab | \s |
特殊字符 | \转译 |
任意个字符 | * |
至少一个字符 | + |
0个或者1个字符 | ? |
n个字符 | {n} |
{n,m}个字符 | {n,m} |
精确匹配 | [] |
或匹配 | | |
行开头 | ^ |
行结束 | $ |
举例:
- [0-9a-zA-Z\_]
可以匹配一个数字、字母或者下划线
- [0-9a-zA-Z\_]+
可以匹配至少由一个数字、字母或者下划线组成的字符串,比如a100
,0_Z
,Py3000
等等;
[a-zA-Z\_][0-9a-zA-Z\_]*
可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}
更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
-A|B
可以匹配A或B,所以(P|p)ython可以匹配’Python’或者’python’。^
表示行的开头,^\d表示必须以数字开头。$
表示行的结束,\d$表示必须以数字结束。
2.re模块
==在python中使用正则表达式前加上r
前缀,就不用考虑转义的问题。==
1. re.match()
语法:re.match(pattern,string, flags=0)
函数参数说明:
参数 | 描述 |
---|---|
pattern | 原有字符串 |
string | 用户输入的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
匹配成功re.match
方法返回一个匹配的对象,否则返回None
。
实例 1:
#!/usr/bin/python#
-*- coding: UTF-8 -*-
import re
>>> print(re.match(r'www','www.runoob.com'))
<_sre.SRE_Match object; span=(0, 3), match='www'>
>>> re.match(r'^\d{3}\-\d{3,8}','010-12345')
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
2. re.search()
扫描整个字符串,并匹配,其余与re.match()
相同。
3. re.sub
用于替换已经匹配的字符
re.sub(pattern, repl, string, count=0)
- 参数:
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
#!/usr/bin/python3
import re
phone ="2004-959-559 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.*$',"", phone)
print("电话号码 : ", num)
# 移除非数字的内容
num = re.sub(r'\D',"", phone)
print("电话号码 : ", num)
以上实例执行结果如下:
电话号码:2004-959-559
电话号码:2004959559
repl 参数是一个函数
以下实例中将字符串中的匹配的数字乘于 2:
#!/usr/bin/python
import re
# 将匹配的数字乘于 2
defdouble(matched):
value =int(matched.group('value'))
return str(value *2)
s ='A23G4HFD567'
print(re.sub('(?P\d+)',double, s))
执行输出结果为:
A46G8HFD1134
re.findall()
将匹配到的参数用一个列表表示出来
import re
p = re.compile(r'\d+')
print p.findall('one1two2three3four4')
### output ###
# ['1', '2', '3', '4']+
3. 全解匹配表达式(一个大列表)
正则表达式修饰符 - 可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式:
1. 字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
1. 多数字母和数字前加一个反斜杠时会拥有不同的含义。
1. 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
1. 反斜杠本身需要使用反斜杠转义。
下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
模式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,’m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符 |
re* | 匹配0个或多个的表达式 |
re+ | 匹配1个或多个的表达式 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式re{ n}re{ n,}精确匹配n个前面表达式。 |
re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a| b | 匹配a或b(re)G匹配括号内的表达式,也表示一个组 |
(?imx) | 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。 |
(?-imx) | 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。 |
(?: re) | 类似 (…), 但是不表示一个组 |
(?imx: re) | 在括号中使用i, m, 或 x 可选标志 |
(?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 |
(?#…) | 注释. |
(?= re) | 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
(?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
(?> re) | 匹配的独立模式,省去回溯。 |
\w | 匹配字母数字 |
\W | 匹配非字母数字 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f]. |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9]. |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\B | 匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
\n, \t, 等. | 匹配一个换行符。匹配一个制表符。等 |
\1…\9 | 匹配第n个分组的内容。 |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
4.切分字符串
比较.split()
函数,正则表达式的切分更加灵活
例如:
>>> zaq='zaq 22 python 29' #当python前后多了两个空格
>>> zaq.split(' ') #使用split切分
['zaq', '22', '', 'python', '', '29']#会把空格也切分出来
>>> re.split(r'\s+',zaq) #使用正则表达式
['zaq', '22', 'python', '29'] #完美切分
>>> zaq='zaq ,22, python, 29' #多出切分
>>> re.split(r'[\s\,]+',zaq)
['zaq', '22', 'python', '29']
>>> re.split(r'[\,\s\d2]+',zaq) #匹配一个数字
['zaq', 'python', '']
5.分组
我们可以使用group(num)
或groups()
提取子串。
匹配对象方法 | 描述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'