ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

正则表达式的系统学习

2022-01-13 20:33:11  阅读:159  来源: 互联网

标签:返回 正则表达式 text 系统 学习 re print findall


正则表达式的系统学习

概念:

  • 正则表达式是为了找到符合某种模式的字符串,这些模式包括:是什么字符串、重复多少次、在什么位置、有哪些额外的约束。这里的每一句话对应这正则表达式的一种语法。

1.正则表达式的7种境界

#正则表达式的7个境界

# level1 - 固定的字符串
import re

 print(re.findall(r'168', text)) #fianall返回的是一个列表

level2 - 某一类字符

print(re.findall(r'\d', text)) #\d返回的是单个数字
print(re.findall(r'\d', text)) #\d返回的是单个数字
print(re.findall(r'\D', text)) #\D返回的是非数字
print(re.findall(r'\w', text)) #\w返回的是非标点符号的其他字符
print(re.findall(r'[1-5]', text)) #[]表示从中挑一个就行
print(re.findall(r'[高重非]', text)) #[]表示从中挑一个就行

# level3 - 重复某一类字符

text = '麦叔身高:178,体重:168,学号:123456,密码:9527'
print(re.findall(r'\d+', text)) #+修饰前边的内容
print(re.findall(r'\d?', text)) #?表示0个或1个,结果为['', '', '', '', '', '1', '7', '8', '', '', '', '', '1', '6', '8', '', '', '', '', '1', '2', '3', '4', '5', '6', '', '', '', '', '9', '5', '2', '7', '']
print(re.findall(r'\d*', text)) #*表示0个或多个,结果为['', '', '', '', '', '178', '', '', '', '', '168', '', '', '', '', '123456', '', '', '', '', '9527', '']
print(re.findall(r'\d{4,}', text))#{}表示重复前面多少次,是个区间,该表示方法为大于4次,输出结果:['123456', '9527']

# leve4 - 组合level2

text = '麦叔电话是18812345678,他还有一个电话号码是18887654321,他爱好的数字是01234567891,他的座机是:0571-52152166'
print(re.findall(r"\d{3,4}-\d{7,8}",text)) #输出结果为:['0571-52152166'],区号匹配三位四位都可以,电话好匹配7位8位都行

# leve5 - 多种情况
#
# 要求:找出手机号码或者座机号码

text = '麦叔电话是18812345678,他还有一个电话号码是18887654321,他爱好的数字是01234567891,他的座机是:0571-52152166'
patter = "\d{3,4}-\d{7,8}|1\d{10}" #|表示都行
print(re.findall(patter,text))
#
# level6 - 限定位置
#
#要求:在句子开头的手机号码,或座机

text = '18812345678,他还有一个电话号码是18887654321,他爱好的数字是01234567891,他的座机是:0571-52152166'
parter = "^1\d{10}|\d{4}-\d{8}" #^以什么开头
print(re.findall(parter,text))


# level7 - 内部约束
#
# 要求:找出形如barbar, dardar的前后三个字母重复的字符串

text = 'barbar carcar harhel'
print(re.findall(r'(\w{3})(\1)', text)) #():表示一组一组的分好,\:表示引用。\1表示我要和前面括号中的一样(\2)表示和前面第二个人括号一样
#()分成两部分

2. 写正则表达式的步骤

如何写正则表达式呢?我总结了几个步骤。不管多复杂,基本上都百试不爽。

我们仍然以包含分机号码的座机电话号码为例,比如0571-88776655-9527,演示下面的步骤:

  • 确定模式包含几个子模式

    它包含3个子模式:0571-88776655-9527。这3个子模式用固定字符连接。

  • 各个部分的字符分类是什么

    这3个子模式都是数字类型,可以用\d。现在可以写出模式为:\d-\d-\d

  • 各个子模式如何重复

    第1个子模式重复3到4次,因为有010和021等直辖市

    第2个子模式重复7到8次,有的地区只有7位电话号码

    第3个子模式重复3-4次

    加上次数限制后,模式成为:\d{3,4}-\d{7,8}-\d{3,4}

    但有的座机没有分机号,所以我们用或运算符让它支持两者:

    \d{3,4}-\d{7,8}-\d{3,4}|\d{3,4}-\d{7,8}

  • 是否有外部位置限制

    没有

  • 是否有内部制约关系

    没有

#需求:匹配分机号码
tex = "0571-88776655-9527.dfvgai;;sdbv;asdv;asv;iasvi;cav"
pater = "\d{4}-\d{8}-\d{4}"
result = re.findall(pater,tex)
print(result)

[^3-8] 表示取反的意思,除了3-8之间都可以

abc{8}:c重复8次;(abc){8}:abc重复8次

4. Python正则模块re的用法

python的re模块还比较简单,包括以下几个方法:

  • re.search():查找符合模式的字符,只返回第一个,返回Match对象,用来查找文件里有没有这种东西,
  • re.match():和search一样,但要求必须从字符串开头匹配(和search一样都是只返回一个,返回的是一个对象,对象中包含了很多方法及属性)
  • re.findall():返回所有匹配的字符串列表
  • re.finditer():返回一个迭代器,其中包含所有的匹配,也就是Match对象
text = '麦叔电话是18812345678,他还有一个电话号码是18887654321,0581-52152166他爱好的数字是01234567891,他的座机是:0571-52152166'
it = re.finditer(r"(\d{4})-(\d{8})",text)
for m in it:
    print(m) #返回的是一个对象,返回一个迭代器
  • re.sub():替换匹配的字符串,返回替换完成的文本

  • re.subn():替换匹配的字符串,返回替换完成的文本和替换的次数

text = "aBc,dafaa Abc ABC"
result = re.sub(r"abc","***",text,flags=re.I) #输出结果:***,dafaa *** ***,前面是要匹配的目标,后面是匹配的内容
print(result)
  • re.split():用匹配表达式的字符串做分隔符分割原字符串

    text = "aBc,dafaa Abc ABC"
    result = re.split(r"\s*[,;/]\s*",text) #分割,输出的结果为 ['aBc', 'dafaa Abc ABC']
    print(result)
    
    • re.compile():把正则表达式编译成一个对象,方便后面使用 #compile:把正则表达式变成一个可传递的对象

标签:返回,正则表达式,text,系统,学习,re,print,findall
来源: https://www.cnblogs.com/yangzilaing/p/15799547.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有