#正则表达式(RegularExpression, re)

  • - 是一个计算机科学的概念
  • - 用于使用单个字符串来描述,匹配符合某个规则的字符串
  • - 常常用来检索,替换某些模式的文本



#正则的写法


  • - .(点):表示任意一个字符,出\n,比如查找所有的一个字符\.
  • - []:匹配中括号中列举的任意字符,比如[L,Y,0],LLY, Y0, LI
  • - \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))



案例re1.py

# 导入相关包
import re
# 超找数字
# r表示字符串不转义
p = re.compile(r'\d+')
# 在字符串"one12towthree33456four78"中进行查找,按照规则p制定的正则进行查找
# 返回None表示没有找到结果,否则会返回match对象
# 参数3,6表示在字符串中查找的返回
m = p.match("one12towthree33456four78", 3, 6)
print(m)
print(m[0])

# 上述代码说明两个问题
# 1.match可以输入阐述表示起止位置
# 2.查找的结果只包含一个,表示第一次进行匹配成功的内容

案例re2.py

import re

# I 表示忽略掉大小写

p = re.compile(r'([a-z]+) ([a-z]+)', re.I)
m = p.match("I am really love liuyifei")
print(m)
print(m.group(2))
print(m.start(2))
print(m.end(2))
print(m.groups())


# 查找


  • - search(str, [,pos[, endpos]]):在字符串中查找匹配,pos和endpos表示起始位置
  • - findall:查找所有
  • - finditer:查找,返回一个iter结果


案例re3.py

import re
p = re.compile(r'\d+')
m = p.search("one12towthree33456four78")
print(m.group(0))

rst = p.findall("one12towthree33456four78")
print(type(rst))
print(rst)


# sub替换


- sub(repl, str[, count])

案例re4.py

import re
p = re.compile(r'(\w+) (\w+)')
s = "hello hi liu 456 yifei, I love you!"
rst = p.sub(r'Hello world', s)
print(rst)


# 匹配中文


- 大部分中文内容表示范围是[u4e00-u9fa5], 不包括全角标点


案例re5.py

import re
title = u'世界 你好,hello world'
p = re.compile(r'[\u4e00-\u9fa5]+')
rst = p.findall(title)
print(rst)


# 贪婪和非贪婪


  1. - 贪婪:尽可能多的匹配,(*)表示贪婪匹配
  2. - 非贪婪:找到符合条件的最小内容即可,(?)表示非贪婪
  3. - 正则默认使用贪婪匹配

案例re6.py

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())