加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

re和正则表达式

发布时间:2020-12-14 05:47:48 所属栏目:百科 来源:网络整理
导读:正则表达式: 正则表达式与re的关系 正则表达式是一门独立的技术,适用于任何语言 但在python‘中使用正则表达式将必须借助re模块 正则表达式就是一堆有语法的字符,用于匹配字符串中符合规则的内容 字符组: 在同一位置可能出现的各种字符组成了一个字符组,

正则表达式:

正则表达式与re的关系

正则表达式是一门独立的技术,适用于任何语言

但在python‘中使用正则表达式将必须借助re模块

正则表达式就是一堆有语法的字符,用于匹配字符串中符合规则的内容

字符组:

在同一位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示

字符分很多种,比如数字,字母,标点等等。[ ]里面是或的关系

[012345678] 检查匹配字符里面所有符合字符组里面的字符的单个字符
[0-9] 匹配0到9的数字
[a-z] 匹配a到z的所有小写字母
[A-Z] 匹配A到Z的所有大写字母

?

?

?

?

?

?

?

?

字符

元字符 匹配内容
? ? ? . 匹配除换行符以外的任意字符
 w 匹配字母,数字,或下划线
? ?W 匹配非字母,数字,下划线
? d 匹配0到9的数字字符
? D 匹配非0到9的字符
? ?s 匹配任意的空白符
? ?S 匹配任意的非空白符
? ?n 匹配一个换行符
? ?t 匹配一个制表符(tab键)
? ^ 匹配字符串的首位字符
? ?$ 匹配字符串的末尾
? b 匹配一个单词的结尾
?[....] 匹配字符组里面的字符
?[^....] 匹配非字符组里面的字符
? a|b 匹配a或b注意把长的放前面
?() 匹配括号内的表达式,也表示一个组

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

? ? ? 量词

? ? ? * 重复0次或多次
? ? ?+ 重复一次或多次
? ? ?? 重复0次或1次
? ?{n} 重复n次
? ?{n,} 重复n到更多次
? ?{n,m} 重复n到m次

?

?

?

?

?

?

?

?

?

贪婪匹配与非贪婪匹配

贪婪匹配就是尽可能匹配多个

注:正则表达式默认就是贪婪模式(尽可能匹配多的)

非贪婪匹配:

  就是尽可能匹配少的,要想将贪婪模式改为非贪婪模式只需要在量词后面加?就可以将贪婪模式改为非贪婪模式

?

?

?

转义符:

在正则表达式中,有很多有特殊意义的元字符比如n和s,如果要正则中匹配正常的n就需要对进行转义,变成‘‘

贪婪匹配:

正则 待匹配字符 匹配结果 ?
<.*> <script>...<script> 从头开始匹配然后倒退到第一个>结束 ?
<.*?> <script>...<script> 从头开始匹配到第一个>结束 ?

?

?

?

?

?

?

?

?

常用的非贪婪匹配用法:

*? ?重复任意次,但尽可能少重复

+?重复一次或更多次,但尽可能少重复

??重复0次或1次,但尽可能少重复

{n,m}? ?重复n到m次,但尽可能少重复

{n,}? ?重复n到更多次,但尽可能少重复

?

.*?的用法:

.是除换行符外任意字符

*是重复0次或多次

?是非贪婪模式

合在一起就是取尽量少的任意字符,一般不会这么单独写,它大多用在:.*?x

就是取前面任意长度的字符,直到第一个x出现

re模块下的常用方法:

import re

单个字符:

re.I不区分大小写的匹配
print(re.findall(ra,abc123嘿嘿abcABC,flags=re.I))  # [‘a‘,‘a‘,‘A‘]

a|b a或b单个字符
print(re.findall(ra|b,‘b‘,‘A‘,‘B‘]

[a,b] a或,或b单个字符
print(re.findall(r[a,b],abc,123嘿嘿abcABC,‘,‘B‘]

[^ab]非a及非b的所有单个字符
print(re.findall(r[^ab],123嘿嘿abcABC))  # [‘c‘,‘1‘,‘2‘,‘3‘,‘嘿‘,‘c‘,‘B‘,‘C‘]

[a-z]所有单个小写字母   [A-Z]所有单个大写字母   [0-9]所有单个数字
print(re.findall(r[a-z],123嘿嘿abcABC))  # [‘a‘,‘c‘]
print(re.findall(r[0-9],123嘿嘿abcABC))  # [‘1‘,‘3‘]

所有小写大写数字单个字符
print(re.findall(r[a-z]|[A-Z]|[0-9],‘C‘]

print(re.findall(r[A-Za-z0-9],123嘿嘿[abcABC))  # [‘a‘,‘C‘]

 .会匹配除n以为的所有单个字符
print(re.findall(r.,*_+=n rt))  # [‘*‘,‘‘,‘_‘,‘+‘,‘=‘,‘ ‘,‘r‘,‘t‘]

re.S会让.能匹配所有单个字符
print(re.findall(r.,*_+=n rt,flags=re.S))  # [‘*‘,‘n‘,‘t‘]

# d单个数字 == [0-9]
print(re.findall(rd,123嘿嘿[abcABC))  # [‘1‘,‘3‘]
# w == [A-Za-z0-9_]  将常见的汉字就理解为单个字母

print(re.findall(rw,123嘿[_))  # [‘a‘,‘_‘]
# s == [fnrtv ] 单个空:空格、制表符、换页符等

print(re.findall(rs,fnrtv ))  # [‘x0c‘,‘t‘,‘x0b‘,‘ ‘]

 D就是d的对立面:非数字的所有单个字符  W就是w的对立面  S就是s的对立面
print(re.findall(rD,‘[‘,‘_‘]

三个必须掌握的方法:

  findall:匹配目标字符串并返回所有符合正则表达式的内容

  search:依据正则规则匹配到第一个就不匹配了并返回匹配到的对象,然后group()就可以拿到内容,如果没有就返回none,并且不能group获取

  match:只会匹配字符串的开头部分,然后返回,group获取,当字符串中的开头部分不符合正则规则时会返回一个none,和上面一样,另外这个一般是用来进行校验的。

其他方法:

ret = re.split([ab],abcd)  # 先按‘a‘分割得到‘‘和‘bcd‘,在对‘‘和‘bcd‘分别按‘b‘分割
print(ret)  # [‘‘,‘‘,‘cd‘]

ret = re.sub(d,H,eva3egon4yuan4,1)  # 将数字替换成‘H‘,参数1表示只替换1个
print(ret)  # evaHegon4yuan4

ret = re.subn(d,eva3egon4yuan4)  # 将数字替换成‘H‘,返回元组(替换的结果,替换了多少次)
print(ret)

obj = re.compile(d{3})  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search(abc123eeee) #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())  #结果 : 123

import re
ret = re.finditer(d,ds3sy4784a)   #finditer返回一个存放匹配结果的迭代器
print(ret)  # <callable_iterator object at 0x10195f940>
print(next(ret).group())  #查看第一个结果
print(next(ret).group())  #查看第二个结果
print([i.group() for i in ret])  #查看剩余的左右结果
View Code

分组优先机制

import re
res = re.search(^[1-9]d{14}(d{2}[0-9x])?$,110105199812067023)
print(res.group())
print(res.group(1))  # 获取正则表达式括号阔起来分组的内容
print(res.group(2))  # search与match均支持获取分组内容的操作  跟正则无关是python机制

# 而针对findall它没有group取值的方法,所以它默认就是分组优先获取的结果
ret = re.findall(www.(baidu|oldboy).com,www.oldboy.com)
print(ret)  # [‘oldboy‘]     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret = re.findall(www.(?:baidu|oldboy).com,www.oldboy.com)  # ?:取消分组优先
print(ret)  # [‘www.oldboy.com‘]
View Code

其他

import re


ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>")
#还可以在分组中利用?<name>的形式给分组起名字
#获取的匹配结果可以直接用group(‘名字‘)拿到对应的值
print(ret.group(tag_name))  #结果 :h1
print(ret.group())  #结果 :<h1>hello</h1>
"""
注意?P=tag_name相当于引用之前正则表达式,并且匹配到的值必须和前面的正则表达式一模一样
"""

# 匹配整数
ret=re.findall(r"d+","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #[‘1‘,‘60‘,‘40‘,‘35‘,‘5‘,‘4‘,‘3‘]

ret=re.findall(r"d+.d*|(d+)",‘3‘]
ret.remove("")
print(ret) #[‘1‘,‘3‘]
View Code

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读