python学习——正则表达式

正则表达式的理解

通俗的理解就是在大量数据中,匹配自己想找到的内容,或者筛选合格的内容,过滤掉不合格的内容。
在python中,正则表达用到了re库,是pycharm自带的库,包含了众多方便使用正则表达式快速得到匹配目标的方法。比如math()、search()、findall()这是几个最常用的方法。

匹配范围确定

常用中括号[ ],括号括住的就是搜索目标。
[abc]:搜索目标是a、b、c,三个
[a-c]:同样搜索目标是a、b、c

re.search()

从第一个字符开始匹配,直到有一个可以匹配成功,且只匹配一个,否则返回none

import re
message = 'sduha128abc1f'
result = re.search('[abc]',message)
print(result)

#得到的结果是:
<_sre.SRE_Match object; span=(4, 5), match='a'>
这个结果不能直接使用,是一种特殊的格式
可以看到(4,5),说明在message中多个abc,只找到一个,而且是第一个。

re.match()

这个规定比较严格,只能从第一个匹配,第一个若不匹配,则匹配失败。

import re
message = 'sduha128abc1f'
result = re.match('[abc]',message)
print(result)

得到结果:
none
匹配失败,因为第一个不是a、b、c中的任一个

re.findall()

从第一个开始匹配,匹配到最后一个,把符合正则表达式的全部找到,返回一个列表,包含所有匹配成果。

import re
message = 'sduha128abc1f'
result = re.findall('[abc]',message)
print(result)

得到结果
['a', 'a', 'b', 'c']

匹配个数确定

限制某种字符匹配多少次。
规定用{ }里面写想匹配的次数,也可以用各种规定的符号。
*:匹配表达式任意次数
+:匹配表达式一次或多次
?:匹配表达式零次或一次
{整数}:匹配目标整数次
{整数,}:匹配目标至少整数次
{整数a,整数b}:匹配目标在a到b次之间

import re
message = 'zabcabcabc123'
result1 = re.findall('[abc]{5}',message)
print(result1)
['abcab']
规定匹配5次,只有5次
result2 = re.findall('[abc]{5,}',message)
print(result2 )
['abcabcabc']
至少5次
result3 = re.findall('[abc]?',message)
print(result3 )
['', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', '', '', '', '']
匹配0次或1次,所以第一次匹配失败是空的‘’,之后都成功,最后三次失败,所以最后三次都空‘’
result4 = re.findall('[abc]+',message)
print(result4 )
['abcabcabc']
匹配一次或多次,所以也是有多少要多少的意思

规定匹配从哪儿开始,从哪儿结束

两个符号^和$
^:必须从开始匹配,否则匹配失败
$:必须从结尾开始匹配,否则匹配失败

import re
message = 'zabcabcabc'
result1 = re.findall('[abc]{5}$',message)
print(result1)
得到结果是:
['bcabc']:从最后拿了五个

message = 'zabcabcabc123'
result1 = re.findall('[abc]{5}$',message)
print(result1)
匹配失败,因为最后是123,不是匹配目标,所以失败

re.match()和^很像,都是必须从字符串开头匹配。

验证手机号是否输入正确

手机号一定只有11位,且第一位一定是1,因为只输入手机号,所以不论从头开始还是从结尾开始,都得满足要求,所有用findall得用^和$卡两边,用match只需要用$卡结尾。

import re
phone = input('请输入手机号码:')
result = re.findall('^1[0-9]{10}$',phone)
#result = re.match('1[0-9]{10}$',phone)
print(result)

验证用户名是否输入正确

用户名规定,字母(大小写)数字下划线,数字不能开头。长度大于8位

import re
message = input('请输入用户名:')
result = re.findall('^[A-Za-z_][A-Za-z0-9_]{7,}$',message)
#经验,[]中可以输入多个范围,比如[A-Za-z_]
#经验,{7,}次数限制,只针对最后一个正则表达式
print(result)

正则表达式的简写符号

常见的需要记忆
\d:数字字符,等价于[0-9]
\D:非数字字符
\s:任何不可见字符,空格,换页,tab
\S:任何可见字符
\w:等价于[A-Za-z0-9_]
\W:任何非单词字符,和\w完全相反
\b:匹配单词边界,即单词和空格之间的位置

\f:换页符
\n:换行符
\r:回车符
\t:tab制表符

正则表达式前加‘r’:因为正则表达式是被写为字符串的形式,字符串中写\n,不知道是换行符还是匹配换行符,所以在正则表达式字符串前面加r,表示匹配换行符。

.:一点(英文版的),匹配除了‘\n’和‘\r’之外的所有单个字符。

正则表达,逻辑或,组,两个概念

“|”:将两个匹配条件进行逻辑或运算
():用括号括住正则表达式,最后得到的匹配结果自动把括号内匹配的内容给分组。() 是正则表达式中使用比较频繁的。
‘\1’:用法和()搭配,\1对应第一个(),\2对应第二个(),且\1代表的必须和()里面的内容完全一样。

import re
message = '<t1>首页</t1>'
result = re.findall(r'^<(\w+)>(.+)</\1>$',message)
#这儿\1的意思,必须和第一个括号的内容一样,
#因为加了两个括号,所以得到result是列表,有两个内容,
#比如,'<t1>首页</首页>'正则表达去一个括号,'^<\w+>(.+)</\1>$',这时两个“首页”是一样的
print(result)

inf = '<dt><a>首页</a></dt>'
result1 = re.findall(r'^<(\w+)><(\w+)>(.+)</\2></\1>$',inf)#引用匹配
result2 = re.findall(r'^<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>$',inf)
#把“dt”命名为“name1”,“a”命名为“name2”,用关键字“?P”来声明给匹配目标命名写法
print(result1[0][2])#这是一个二维的,列表里面嵌套一个元组,[('dt', 'a', '首页')]

借助正则表达式修改文本

这儿聊re库中的两个方法,re.compile()和re.sub()
re.compile():功能是把经常用到的正则表达式打包,作为一个正则公式,比如:pattern = re.compile(’\d{2}:\d{2}’),在re.findall(pattern,message)直接当做公式使用。
re.sub():功能是把匹配到的给替换掉,有三个参数,re.sub(正则表达式,替换内容,message)

import re

#借助正则表达,修改文本

#sub:把一串字符中的所有字母,转换为‘O’
content = 'fsf12sdf38df78'
content = re.sub('\d','O',content)
print(content)

#将正则字符串编译成正则表达式对象,以便在后面的匹配中重复使用
#用pattern = re.compile('正则表达式'),把正则表达式单独拿出来,当做一个对象
content1 = "2020 12 15 12:17"
content2 = "2020 12 15 13:17"
content3 = "2020 12 15 15:17"
pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern,'',content1)
result2 = re.sub(pattern,'',content2)
result3 = re.sub(pattern,'',content3)
print(result1,result2,result3)

常用的正则表达式

[\u4e00-\u9fa5]:匹配所有汉字,[\u4e00-\u9fa5]+,匹配多个汉字。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值