Python—正则

正则表达式(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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值