模块基础——正则表达式及re模块的使用

正则表达式

​ 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

​ 正则表达式和语言没有关系,他不止在Python中会使用到,在其他的开发语言中也会使用到,在在整个编程界有着举足轻重的地位。下面我们通过一个小案例来引入。

​ 当我们进行注册一个网站的时候,有时需要输入手机号,但是如果你随便输入,它会显示不符合电话号码的格式,这是怎么完成的呢?其实都是在程序后台进行了参数校验,一般情况下我们的解决方法会是什么样的呢?

手机号的特征:

  1. 必须是数字
  2. 手机号是11位
  3. 满足常见的手机号:13,15,18,19

解决代码:

while True:
    phone_number = input('please input your phone number : ')
    if len(phone_number) == 11 \
            and phone_number.isdigit()\
            and (phone_number.startswith('13') \
            or phone_number.startswith('14') \
            or phone_number.startswith('15') \
            or phone_number.startswith('18')):
        print('手机号码合法')
    else:
        print('手机号码不合法')

但是我们如果使用了正则表达式,解决代码如下:

import re
phone_number = input('please input your phone number : ')
if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):
        print('手机号码合法')
else:
        print('手机号码不合法')

通过对比,很明显我们能分辨出来^(13|14|15|18)[0-9]{9}$就是使用了正则表达式,这样的方式更加简便,注意在Python中,是通过借助re模块来对正则表达式进行使用的。下面我们对正则表达式进行详细的介绍。

补充:正则表达式在线测试工具:http://tool.chinaz.com/regex/

字符组
# 语法格式:[字符组]
在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示
正则说明
[0123456789]匹配0-9中的任意一个数字,注意只匹配一个字符
[0-9]匹配0-9中的任意一个数字,注意只匹配一个字符
[a-z]匹配a-z的26个小写英文字母,注意只匹配一个字符
[A-Z]匹配A-Z的26个大写英文字母,注意只匹配一个字符
[0-9a-zA-Z]匹配大写字母和小写字母以及数字,注意只匹配一个字符
字符
元字符说明
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线
\s匹配任意的空白符
\d匹配数字
\n匹配一个换行符
\t匹配一个制表符
\b匹配一个单词的结尾
^匹配字符串的开始
$匹配字符串的结尾
元字符说明
\W匹配非字母或数字或下划线
\D匹配非数字
\S匹配非空白符
a|b匹配字符a或字符b
()匹配括号内的表达式,也表示一个组
[…]匹配字符组中的字符
[^…]匹配除了字符组中字符的所有字符
量词
量词说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n次到m次
贪婪匹配和非贪婪匹配

​ 正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),即为尝试匹配尽可能多的字符;非贪婪的则相反,即匹配尽可能少的字符。

​ 例如:正则表达式ab*如果用于查找”abbbc”,将找到”abbb”。而如果使用非贪婪的数量词ab*?,将找到”a”。

  • 常用的几个非贪婪匹配Pattern

    表达式说明
    *?重复任意次,但尽可能少重复
    +?重复1次或更多次,但尽可能少重复
    ??重复0次或1次,但尽可能少重复
    {n,m}?重复n到m次,但尽可能少重复
    {n,}?重复n次以上,但尽可能少重复
  • .*?的用法

    . 表示是任意字符
    * 表示是重复0到无穷次
    ? 表示非贪婪模式
    
    组合在一起的意思就是取尽可能少的任意字符,但是一般情况下不会单独使用,会按照.*?x来使用,表示的含义为取前面任意长度的字符,直到字符x出现结束。
    

re模块

​ 在Python中,要想使用正则表达式,就必须借助re模块。

re模块下的常用方法
  • findall():返回所有满足匹配条件的结果,放在列表里

    import re
    
    res = re.findall('a', 'eva evenon yuan')
    print(res) # 结果 : ['a', 'a']
    
  • search():函数会在字符串内查找模式匹配,只到找到第一个匹配的返回,返回的结果为一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

    import re
    
    res = re.search('a', 'eva evenon yuan')
    print(res.group()) # 结果 : 'a'
    
    res1 = re.search('a', 'bbbbbbb')
    print(res1)  # None
    
  • match():与search一样,但是不同点在于只在字符串开头处匹配。

    import re
    
    res = re.match('a', 'abc').group()
    print(res)  # 'a'
    

注意:findall()的优先级匹配。

import re

res = re.findall('www.(baidu|sogou).com', 'www.baidu.com')
print(res)  # ['baidu']     
# 这是由于findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
# 通过?:来取消权限

ret = re.findall('www.(?:baidu|sogou).com', 'www.baidu.com')
print(ret)  # ['www.baidu.com']
实战练习

对红牛官网的各分公司信息进行提取。

# 前提准备:保存红牛官网源代码为redbull.txt  获取方式为:右键查看源代码,复制保存即可。

# 代码:
with open('redbull.txt', 'r', encoding='utf-8') as f:
    data = f.read()

title_list = re.findall('<h2>(.*?)</h2>', data)
address_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)

all_list = list(zip(title_list, address_list, email_list, phone_list))

for item in all_list:
    print("""
        公司:%s
        地址:%s
        邮箱:%s
        电话:%s
    """ % (item[0], item[1], item[2], item[3]))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值