正则表达式(RegularExpression, re)
- 是一个计算机科学的概念
- 用于使用单个字符串来描述,匹配符合某个规则的字符串
- 常常用来检索,替换某些模式的文本
正则的写法
-
.(点号):表示任意一个字符,除了\n, 比如查找所有的一个字符 .
-
[]: 匹配中括号中列举的任意字符,比如[L,Y,0] , LLY, Y0, LIU
-
\d: 任意一个数字
-
\D:除了数字都可以
-
\s:表示空格,tab键
-
\S:除了空白符号
-
\w: 单词字符, 就是a-z, A-Z, 0-9, _
-
\W: 除了
-
: 表示前面内容重复零次或者多次, \w
-
+: 表示前面内容至少出现一次
-
?: 前面才出现的内容零次或者一次
-
{m,n}:允许前面内容出现最少m次,最多n次
-
^:匹配字符串的开始
-
$:匹配字符串的结尾
-
\b:匹配单词的边界
-
():对正则表达式内容进行分组, 从第一个括号开始,编号逐渐增大
验证一个数字: ^\d$ 必须有一个数字,最少一位:^\d+$ 只能出现数字,且位数为5-10位: ^\d{5,10}$ 注册者输入年龄,要求16岁以上,99岁以下: ^[16-99]$ 只能输入英文字符和数字: ^[A-Za-z0-9]$ 验证qq号码: [0-9]{5,12}
-
\A: 只匹配字符串开头, \Aabcd, 则abcd
-
\Z: 仅匹配字符串末尾, abcd\Z, abcd
-
|: 左右任意一个
-
(?P…): 分组,除了原来的编号再制定一个别名, (?P12345){2}, 1234512345
-
(?P=name): 引用分组,
##RE使用的大致步骤
#1.使用compile将表示正则的字符串编译为一个pattern对象
#2.使用pattern对象提供的一系列方法对文本进行查找匹配,获得匹配结果,一个Match对象
#3.最后使用Match对象提供的属性和方法获得信息,根据需要进行操作
RE常用函数
1.group():获得一个或者多个分组匹配的字符串,当要获得整个匹配的子串时,直接使用group或者group(0)
2.start:获取分组匹配的子串在整个字符串中的起始位置,参数默认为0
3.end:获取分组匹配的子串在整个字符串中的结束位置,参数默认为0
4.span:返回结构区间(start(group),end(group))
import re
#定义规则,查找数字
p = re.compile(r'\d+')
m = p.match("one1112twothre24624")
print(m)
#找到是返回match值,没找到则返回None
#结果是None
m = p.match("one1112twothre24624",3,9)#在3-7闭区间里查找
print(m)
#结果:<re.Match object; span=(3, 7), match='1112'>
总结:
1.match可以输入参数表示起始位置
2.返回的是第一次查找到的内容
print(m[0])#第一次匹配到的内容
print(m.start(0))#第一次匹配到的起始位置
print(m.end(0))#第一次匹配到的结束位置
#re.I:忽略大小写
p = re.compile(r'([a-z]+) ([a-z]+)',re.I)
#分成两组,每组至少有一个小写字母组成,中间有个空格
m = p.match("I study in abc")
print(m)
#参数是0的话就是结果
print(m.group(0))#匹配整个子串
print(m.start(0))#参数默认为0
print(m.end(0))
#如果带有其他数字,就是在符合条件的内容里进行分组,比如刚才的 I study 是结果,那么 I 就是1,study就是2
print(m.group(1))
print(m.start(1))
print(m.end(1))
#结果:
# I
# 0
# 1
print(m.groups())
#结果:('I', 'study')
查找
1.serch(str,[,pos[,endpos]]):在字符串中查找匹配,pos和endpos为始终位置
2.findall:查找所有
3.finditer:查找,返回一个iter结果
import re
p = re.compile(r'\d+')
m = p.search("one112two223thr11")
print(m.group())
rst = p.findall("one112two223thr11")
print(type(rst))
print(rst)
#结果:
# <class 'list'>
# ['112', '223', '11']
#可见返回的是一个list类型
sub 替换
#sub(rep1,str[,count])
p = re.compile(r'(\w+) (\w+)')
s= "hello 444 world 111 hah,i study in NjUPT"
rst = p.sub("hello world",s)
print(rst)
#结果:
# hello world hello world hah,hello world hello world
匹配中文
#大部分中文内容表示范围是[u4e00-u9fa5],不包括全角符号
title = u'世界 你好,hello moto'
p = re.compile(r'[\u4e00-\u9fa5]+')
rst = p.findall(title)
print(rst)
#结果:['世界', '你好']
贪婪和非贪婪
贪婪:尽可能多的匹配,(*)表示贪婪匹配
非贪婪:找到符合条件的最小内容即可,(?)表示非贪婪
正则默认使用贪婪
import re
title = u'<div>name</div><div>age</div>'
p1 = re.compile(r'<div>.*</div>')
p2 = re.compile(r'<div>.*?</div>')
m1 = p1.search(title)
print(m1.group())
m2 = p2.search(title)
print(m2.group())
#结果:
# <div>name</div><div>age</div>
# <div>name</div>