正则表达式及re模块

一.正则表达式

       什么是正则表达式:正则表达式是一种描述文本模式的语言,它用于匹配、搜索和替换文本中的字符序列。简单来说,正则表达式是一种用来描述字符串模式的规则。通过使用正则表达式,可以快速、高效地搜索、处理和替换特定形式的字符串。它在很多编程语言和应用程序中都得到了广泛的应用。

1. 字符

        在正则表达式中,我们经常用到的有

字符: 
.      匹配除了换行符的任意字符。
\w  匹配字母,数字和下划线。
\d  匹配所有数字
\n  匹配换行符
a|b 匹配a或b
()  匹配括号里的字符组
^   匹配以什么开头
$   匹配以什么结尾
[...]匹配字符组中的字符
[^...]匹配除了字符组的所有字符

补充:

2. 量词

        在正则表达式中,量词用于指定一个模式可以出现的次数,他只会影响前一个字符(ab+)只能影响a,不能影响b。量词不可单独使用,必须配合表达式使用。

*        重复0次或多次
+        重复1次或多次
?        重复0次或者1次
{n}        重复执行n次
{n,}    重复执行n多更多
{n,m}    重复n至m

3. 贪婪与非贪婪匹配

        贪婪匹配是指在正则表达式中采用的一种匹配策略,即会尽可能地匹配更多的字符 

在满足条件时,会尽可能的匹配多个值。

# 待匹配的文本
<script>hello</script>

# 正则
<.*>
# <script>
# <script>hello</script>

取消贪婪匹
配的关键词:<.*>

.   任意字符

* 重复0次至无数次

? 是非贪婪模式

组合在一起<.*>就是尽可能的匹配少的字符,.*?x ,意思就是去前面任意的长度,直到x停止。

实列

{n,m}
^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{14}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$

# 对于常见的正则表达式,我们直接取百度搜索,实际编码中,我们可以写一些简单的正则.
##1. 手机号正则 :


 /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/##2
身份证的正则:"^[1-9]\\d{5}(19\\d{2})|(20[01]\\d)|(202[012])(((0[13578])|10|12)((0[1-9])|(([12][0-9])|30|31)))|(((0[469])|11)((0[1-9])|(([12][0-9])|30)))|(02((0[1-9])|([12][0-9])))//d{4}"

^[1-9]\d{13,16}[0-9x]$:意思为,只能是一到九开头的数字,后面的数字是13到16,之后0-9之间的数

4. 取消转义

在大多数正则表达式中,可以使用反斜杠(\)来转义字符。如果想要取消转义,可以使用两个反斜杠(\)来表示一个反斜杠字符本身。例如,如果想要匹配一个包含反斜杠的字符串,可以使用正则表达式 \\ 来匹配一个反斜杠字符。

但在python中,推荐使用\n ,\t \d等取消转义

二.re模块的常用方法

 1. re模块的使用方法

re模块是Python中的正则表达式模块,用于匹配和处理字符串。

re模块中的主要函数包括:

  • re.match():从字符串的开头匹配正则表达式。和search相同,不同的是在字符串开始处进行处理。
  • import re
    ret = re.match('a', 'jksdlab')
    print(ret)
    try:
        ret = re.match('a', 'jksdlab').group()
        print(ret)
    
    except Exception:
        print(ret)
    
    import re
    ret = re.match('a', 'asdlab').group()
    print(ret)##开头

  • re.search():扫描整个字符串并返回第一个匹配的对象。只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
    # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
  • import re
    ret = re.search('ab', 'sk,eva,sdl,jhsj')
    print(ret)##None

  • re.findall():返回字符串中所有的非重叠匹配项列表。re.findall('正则','待匹配的内容')待匹配内容一定是一个字符串,文本或空列表。如果匹配到内容则按照列表的形式返回,如果匹配不到,则返回空列表 [ ]。
  • import re
    ret = re.findall('a', 'ask,aklsl,sdl,dpowpa')
    print(ret)#[['a', 'a', 'a']
    ]

  • re.sub():用指定的替换字符串替换与正则表达式匹配的所有子字符串。

除了这些,re模块还提供了一些用于编写正则表达式的方法和特殊字符。

使用re模块可以方便地处理字符串,进行文本匹配、替换、分割等操作。

2. 无名分组和有名分组

1. 无名分组:使用小括号括起来的正则表达式就是无名分组

常用:

res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$', '110105199812067023')
print(res)
print(res.group())  # 110105199812067023
print(res.group(1))  # 10105199812067
print(res.group(2))  # 023

# findall针对分组优先展示   无名分组
    """
    如果是findall,分组优先展示,无名分组
    """
    res = re.findall("^[1-9](\d{14})\d{2}[0-9x]?$",'110105199812067023')
    print(res)  # ['023']

findal:优先进行无名分组的优先展示

2. 有名分组:

        有名分组就是使用小括号括起来的正则表达式,然后给命名,就是有名分组

  res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$','110105199812067023')
    print(res)
    print(res.group(1))
    print(res.group(2))
    print(res.group('xxx'))
    print(res.group('ooo'))

分类案列:

        爬取红牛分公司官网数据

        

import re

with open('red bull.txt','r', encoding='utf-8')as f:
    date = f.read()


title_list = re.findall('<h2>(.*?)/h2>', date)
address_list = re.findall("<p class='mapIco'>(.*?)</p>", date)
email = re.findall("<p class='mailIco'>(.*?)</p>", date)
phone = re.findall("<p class='telIco'>(.*?)</p>", date)

res_list = zip(title_list, address_list, email, phone)
for i in list(res_list):
    print("""
            公司名称: %s
            公司地址: %s
            公司邮箱:%s
            公司电话:%s
            """ % (i[0], i[1], i[2], i[3]))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值