Python 编程 | 连载 24 - 正则表达式

简介: Python 编程 | 连载 24 - 正则表达式

一、正则表达式

认识正则表达式

正则表达式是一个特殊的字符序列,便于检查字符串是否与某种模式匹配,正则表达式也是对字符串的处理,通过定义一个规则,使得从字符串中匹配出符合规则的字符串,正则表达式可以:

  • 判断一个字符串是否符合规则,如手机号邮箱判断等
  • 取出指定数据
  • 匹配指定格式的信息

正则表达式通用性强,可适用于很多编程语言。

正则表达式匹配字符

正则表达式匹配字符串需要的条件:

  • re模块
  • 匹配规则
  • 匹配范围,既从哪个字符串中尽心匹配

正则表达式中的特殊字符:

特殊字符 描述
\d 匹配任何十进制的数字,与[0-9]一致
\D 匹配任意非数字
\w 匹配任何字母数字下划线字符
\W 匹非字母数字以及下划线
\s 匹配任何空格字符,与[\n\t\r\v\f]相同
\S 匹配任意非空字符
\A 匹配字符串的起始
\Z 匹配字符串的结束I
. 匹配任何字符,除\n之外
import re
data = 'I am Thor Odinson, 1500 years old'
print('匹配到的数字为:{}'.format(re.findall('\d', data)))
print('匹配到的空格为:{}'.format(re.findall('\s', data)))
print('匹配到的字符为:{}'.format(re.findall('\w', data)))
print('匹配起始字符串:{}'.format(re.findall('\AI am', data)))
print('匹配末尾字符串:{}'.format(re.findall('old\Z', data)))
print('匹配任何字符:{}'.format(re.findall('.', data)))
复制代码

84904e5ca8394d7fbde68fecb7b36404_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

使用正则表达式定义函数,操作字符串。

import re
def contain_num(data):
    res = re.findall('\d', data)
    if len(res) > 0:
        return True
    return False
def delete_num(data):
    # 匹配出非数字
    res = re.findall('\D', data)
    return ''.join(res)
if __name__ == '__main__':
    data = '95 Anzan Hwy, Ashforad SA 5035 Adelaide'
    contain = contain_num(data)
    print(contain)
    _data = delete_num(data)
    print(_data)
复制代码

image.png

使用正则表达式实现 startwith 函数和 endwith 函数

import re
def starts_with(start, data):
    # 构造正则表达式
    _start = '\A%s' % start
    res = re.findall(_start, data)
    if len(res) > 0:
        return True
    return False
def ends_with(end, data):
    _end = '{}\Z'.format(end)
    res = re.findall(_end, data)
    if len(res) > 0:
        return True
    return False
if __name__ == '__main__':
    data = '13 Ramel Way, Pakenham VIC'
    res_01 = starts_with('13', data)
    res_02 = starts_with('afeae', data)
    res_03 = ends_with('VIC', data)
    print(res_01)
    print(res_02)
    print(res_03)
复制代码

image.png

二、正则表达式的量词与组

正则表达式中的符号:

  • |:或的意思,re1|re2表示匹配表达式1或者表达式2
  • ^:匹配字符串的开头
  • $:匹配字符串的结尾
  • *:匹配0次或者多次前面出现的正则表达式
  • +:匹配1次或者多次前面出现的正则表达式
  • {N}:匹配N次前面出现的正则表达式
  • {M,N}:匹配M~N次前面出现的正则表达式
  • [...]:匹配来自字符集的任意单一字符
  • [x-y]:匹配x~y范围内的单一字符
  • [^..]:不匹配此字符集中出现的任何一个字符,包括某一范围内的字符
  • \:将特殊字符转义

正则表达式中()表示在匹配规则中获取指定的数据。贪婪与贪婪,0或者多次属于贪婪模式,可以通过?组合变成非贪婪模式。

三、正则表达式模块

正则表达式模块的常用方法有:

方法 描述
findall(pattern, string[,flags]) 查找字符串中所有非重复出现的正则表达式模式,返回一个列表
search(pattern, string, flags=0) 使用可选标记搜索字符串中第一次出现的正则表达式模式,如果匹配成功返回匹配对象,否则返回None
group(num) 返回整个匹配对象,或者编号为num的特定子组
groups() 返回一个包含所有匹配子组的元素,如果没有成功匹配,返回一个空元祖
split(pattern, string, max=0) 根据正则表达式的模式分隔符,split函数可以将字符串分割为列表,然后返回成功匹配的列表,分割最多操作max次
match(pattern, string, flags=0) 尝试使用带有可选标记的正则表达式的模式来匹配字符串,匹配成功返回匹配对象,否则返回None
complie(pattern, flags=0) 定义一个匹配规则的对象
import re
def identity(url):
    re_obj = re.compile('[a-zA-Z]{4,5}://\w*.*\w+.\w+')
    print(re_obj)
    res = re_obj.findall(url)
    if len(res) != 0:
        return True
    return False
def get_url(url):
    re_obj = re.compile('[https://|http://](\w*.*\w+.\w+)')
    res = re_obj.findall(url)
    if len(res) != 0:
        return res[0]
    else:
        return False
def get_email(email):
    re_obj = re.compile('.+@.+.[a-zA-Z]+')
    res = re_obj.findall(email)
    return res
def get_html_data(data):
    re_obj = re.compile('style="(.*?)"')
    res = re_obj.findall(data)
    return res
def get_all_data_html(data):
    re_obj = re.compile('="(.+?)"')
    res = re_obj.findall(data)
    return res
if __name__ == '__main__':
    result = identity('http://www.baidu.com/')
    print(result)
    result = get_url('https://www.baidu.com/')
    print(result)
    result = get_email('thor@asgard.com')
    print(result)
    html = ('<div class="s-top-nav" style="display:none;">'
        '</div><div class="s-center-box"></div>')
    result = get_html_data(html)
    print(result)
    result = get_all_data_html(html)
    print(result)
    re_g = re.compile(('<div class="(.*?)" style="(.*?)">'
                       '</div><div class="(.*?)"></div>'))
    result = re_g.search(html)
    print(result.groups())
    print(result.group(1))
    print(result.group(2))
    print(result.group(3))
    # print(result.group(4))
    re_g = re.compile('\s')
    result = re_g.split(html)
    print(result)
    re_g = re.compile('<div class="(.*?)"')
    result = re_g.match(html)
    print(result.span())
    print(html[: 22])
复制代码

image.png


相关文章
|
4月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
334 102
|
4月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
359 104
|
4月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
287 103
|
4月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
213 82
|
3月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
282 3
|
3月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
522 3
|
3月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
340 3
|
3月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
371 0
|
4月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的多面手
Python:现代编程的多面手
102 0
|
4月前
|
存储 人工智能 算法
Python实现简易成语接龙小游戏:从零开始的趣味编程实践
本项目将中国传统文化与编程思维相结合,通过Python实现成语接龙游戏,涵盖数据结构、算法设计与简单AI逻辑,帮助学习者在趣味实践中掌握编程技能。
450 0

推荐镜像

更多