用途
- 使用单个字符串来描述匹配一系列符合某个句法规则的字符串。
- 是对字符串操作的一种逻辑公式。
- 应用场景:处理文本和数据。
- 正则表达式过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;否则匹配失败。
第一个正则表达式
导入re模块(下面的小例子前两句省略)
# -*- coding:utf-8 -*-
import re
str = 're python'
#r代表原字符串,不使用原字符串要注意转义
p = re.compile(r're')
print type(p)
m = p.match(str)
print m.groups()
print m.span()
print m.string
输出结果
<type '_sre.SRE_Pattern'>
re
(0, 2)
re python
单个字符匹配
字符 | 匹配 |
---|---|
. | 匹配任意字符(除了\n) |
[…] | 例如[0-9a-zA-Z]匹配字符集 |
\d或\D | 匹配数字/非数字 |
\s或\S | 匹配空白/非空白字符 |
\w或\W | 匹配单词字符[a-zA-Z0-9]/(空格)非单词字符 |
注意下面这个转义的使用
m = re.match(r'\[[\w]\]','[a]')
print m.group()
输出结果为:
[a]
多个字符匹配
字符 | 匹配 |
---|---|
* | 匹配前一个字符0次或者无限次 |
+ | 匹配前一个字符1次或者无限次 |
? | 匹配前一个字符0次或者1次 |
{m}/{m,n} | 匹配前一个字符m次或者m到n次 |
*?/+?/?? | 匹配模式变为非贪婪(尽可能少匹配字符) |
下面是上述匹配的一些小例子,有助于更好的理解多个字符匹配:
m = re.match(r'[A-Z][a-z]','Aaaaa')
print m.group()
//Aa
m = re.match(r'[A-Z][a-z]*','Aaaaa')
print m.group()
//Aaaaa
m = re.match(r'[A-Z][a-z]+','Aaaaa')
print m.group()
//Aaaaa
#匹配python变量名(以下划线,字符开头)
m = re.match(r'[_a-zA-Z]+[_\w]*','_ht8')
print m.group()
//_ht8
m = re.match(r'[_a-zA-Z]+[_\w]*','ATH')
print m.group()
//ATH
#匹配0-99
m = re.match(r'[1-9]?[0-9]','99')
print m.group()
//99
m = re.match(r'[1-9]?[0-9]','19')
print m.group()
//19
m = re.match(r'[1-9]?[0-9]','9')
print m.group()
//9
#前一个字符没有0,所以后面的没有匹配
m = re.match(r'[1-9]?[0-9]','09')
print m.group()
//0
#匹配qq邮箱或者163邮箱
m = re.match(r'[a-zA-Z0-9]{6,10}@163.com','ad12343@163.com')
print m.group()
//ad12343@163.com
m = re.match(r'[0-9][a-z]*?','1ad12343')
print m.group()
//1
m = re.match(r'[0-9][a-z]+?','1ad12343')
print m.group()
//1a
m = re.match(r'[0-9][a-z]??','1ad12343')
print m.group()
//1
边界匹配
字符 | 匹配 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\A或\Z | 指定的字符串匹配必须出现在开头有/结尾 |
匹配小例子:
# -*- coding:utf-8 -*-
import re
#匹配163邮箱
m = re.match(r'^[\w]{6,10}@163.com$','xuna123@163.com')
print m.group()
//xuna123@163.com
m = re.match(r'\Axuna[\w]*','xunalove123')
print m.group()
//xunalove123
分组匹配
字符 | 匹配 |
---|---|
匹配左右任意一个表达式 | |
(ab) | 括号中表达式作为一个分组 |
\ | 引用编号为num的分组匹配到的字符串 |
(?P) | 分组起一个别名 |
(?P=name) | 引用别名为name的分组匹配字符串 |
演示小例子
m = re.match(r'abc|d','abc')
print m.group()
//abc
#匹配0-99组成的任意字符串
m = re.match(r'[1-9]?\d$','99')
print m.group()
//99
m = re.match(r'[1-9]?\d$','9')
print m.group()
//9
m = re.match(r'[1-9]?\d$|100','100')
print m.group()
//100
#匹配邮箱
m = re.match(r'[\w]{4,6}?@(163|126|qq).com','xuna@qq.com')
print m.group()
//xuna@qq.com
m = re.match(r'<([\w]+>)\1','<book>book>')
print m.group()
//<book>book>
m = re.match(r'<([\w]+>)[\w]+</\1','<book>python</book>')
print m.group()
//<book>python</book>
m = re.match(r'<(?P<mark>[\w]+>)[\w]+</(?P=mark)','<book>python</book>')
print m.group()
//<book>python</book>
re模块其他方法
match方法是用头开始匹配的。
search()方法
从子字符串中查找匹配。# -*- coding:utf-8 -*- import re #查找字符串出现的数字 str1 = 'imooc videonum = 1000' info = re.search(r'\d+',str1) print info.group() //1000 str1 = 'imooc videonum = 2222' info = re.search(r'\d+',str1) print info.group() //2222
findall()方法
查找所有满足要求的匹配,并将结果以列表的形式返回。#查找字符串出现的数字 str1 = 'c++=100, java=90, python=80' info = re.search(r'\d+',str1) print info.group() //100 str1 = 'c++=100, java=90, python=80' info = re.findall(r'\d+',str1) print info //['100', '90', '80'] #列表解析求和 print sum([int(x) for x in info]) //270
sub()方法
将字符串匹配正则表达式部分替换为其他值。# -*- coding:utf-8 -*- import re def add1(match): val = match.group() num = int(val)+1 return str(num) #将数值加一 str1 = 'imooc videonum = 1000' info = re.sub(r'\d+','1001',str1) print info //imooc videonum = 1001 str1 = 'imooc videonum = 9999' info = re.sub(r'\d+',add1,str1) print info //imooc videonum = 10000
split()方法(常用)
根据匹配分割字符串,返回分割字符串组成的列表。str1 = 'imooc:C C++ Java Python,C#' info = re.split(r' ',str1) print info //["imooc:c","c++","Java","Python","C#"]
更新:
- re.compile():
Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先使用re.compile()函数,将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。
在寻找一个字符串中所有的英文字符:
import re
pattern = re.compile('[a-zA-Z]')
result = pattern.findall('ashdsfdhfvdvSHADGWEU1324358703475821')
print result
# ['a', 's', 'h', 'd', 's', 'f', 'd', 'h', 'f', 'v', 'd', 'v', 'S', 'H', 'A', 'D', 'G', 'W', 'E', 'U']