正则表达式学习笔记

正则表达式

好用的正则工具:http://tool.chinaz.com/regex
正则表达式是一种匹配字符串的规则。当我们input给计算机一串数字的时候,判断是不是qq号,是不是手机号等类似场景的时候,根据全数字以及位数长度来进行判断。在判断是否是身份证号的时候:首先是18/15位,第一位都不能为零,18位的最后一位可能是X。
当给定一个文件,里面有很多字符串,需要将这个文件中的所有手机号给提取出来。

正则可以干啥?

使用正则我们可以定制一个规则,来确认某一个字符串是否符合规则。也可以从大段的字符串中找到符合规则的内容。其实正则表达式是一种独立的语法,跟Python没有多大关系。在其他语言中同样有正则。

正则表达式的基础语法

元字符、量词、特殊的用法和现象

元字符

字符组:[],在一个字符的位置上能出现的内容。如:[1a]只匹配1和a
[0-9][A-Z][a-z]匹配三个字符
[abc0-9] 匹配一个字符

18位身份证号

[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][X0-9]
待匹配字符串:海天海洋海流
匹配所有海的字符:海.
只从开头匹配“海”:^海
只匹配结尾的“海”:海$

量词:

一个元字符匹配多次
\d{3} 数字出现三次
\d\d{3} \d是一组\d{3}是一组,四个
\d{3,} 数字至少三次(贪婪匹配原则)
\d{3,5} 数字至少三次,至多5次(贪婪匹配原则)
\d? \d匹配一个数字,?表示至少匹配0次,\d匹配上0次。
. 表示除了换行符的任意字符
\d+(.?\d*)? 整数或小数
“+” 表示重复一次或者多次相当于\d{1,}
“*” 表示匹配0次或多次
量词总结:?表示0次或1次,+表示一次到多次,*表示0次到多次
| 表示左边和右边的所有或,要将长的放前面,短的放后面。

?号的使用

元字符后面跟问号表示量词。
但是在量词后面跟问号:
??

+?
上述用法表示取消贪婪匹配(贪婪算法实现是回溯算法),在能匹配上的基础上尽量匹配少。非贪婪匹配是惰性匹配。
.
?x 匹配任意字符直到遇到x停止。

()的用法

匹配身份证号:
[1-9]\d{14}(\d{2}[1-9X])?

re模块的基本用法

import re

# 字符串
# 匹配
# findall  *****
# search   *****
# match    **

# 返回值类型:列表,返回个数:1 返回值内容:所有匹配上的项
ret = re.findall("\d","1ab2n2j3kkl4ljn12l3ll3j")
print("find list:",ret) 

# 返回值类型:正则匹配结果对象 返回值个数:1 如果匹配上返回匹配对象,如果没有匹配上返回None。
# 返回的对象通过group来获取匹配到的第一个结果。group只管第一个结果。
# findall可以取所有(爬虫用的多),但是search只能取第一个。
ret1 = re.search("\d+","1ab2n2j3kkl4ljn12l3ll3j")
print(type(ret1))
print("ret1:",ret1.group())

# match 相当于search的正则表达式前加上“^”
ret2 = re.match("\d+","1ab2n2j3kkl4ljn12l3ll3j")
print(type(ret2))
print("ret2:",ret2.group())
ret3 = re.match("\d+","%^1ab2n2j3kkl4ljn12l3ll3j")
print(type(ret3))
if ret3:print(ret3.group())
else:print("ret3是None")


# 替换
# sub  ***    "123456hhaa".replace("123","dfsa",10)
ret4 = re.sub('\d+','H',"haohaoxuexi123haolanhua456")
print(ret4)
# subn ***
ret5 = re.subn('\d+','H',"haohaoxuexi123haolanhua456",1)
print(ret5)

# 切割
# split ***
str = "nihao-huashandadizi-heihei"
ret6 = re.split("-",str)
print(ret6)

# 进阶方法 - 爬虫、自动化必须掌握
# compile ***** 预编译功能,节省编译时间。(只用一次不会节省时间,只有多次使用相同的正则表达式的时候,才会帮助减小程序运行时间)
ret7 = re.compile("\d+") # 提前编译好表达式,节省时间
ret8 = ret7.search("sdjflaksfja123132kdjfal")
if ret8:print("ret8:",ret8.group())
# finditer *****  使用迭代器节省空间效率
ret9 = re.finditer('\d+',"kafkljafkasdf;kajsdfkajdfkksafjkajfasfdlandf123kjfak3453")
print(type(ret9))
if ret9:
    for r in ret9:
      print(r.group())
find list: ['1', '2', '2', '3', '4', '1', '2', '3', '3']
<class '_sre.SRE_Match'>
ret1: 1
<class '_sre.SRE_Match'>
ret2: 1
<class 'NoneType'>
ret3是None
haohaoxuexiHhaolanhuaH
('haohaoxuexiHhaolanhua456', 1)
['nihao', 'huashandadizi', 'heihei']
ret8: 123132
<class 'callable_iterator'>
123
3453
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值