首页 > 编程语言 >python学习——正则表达式详解

python学习——正则表达式详解

时间:2024-12-08 17:28:50浏览次数:6  
标签:字符 匹配 string re python pattern 正则表达式 详解

正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串中字符组合的模式。它是一种强大、灵活且高效的文本处理工具,广泛应用于数据验证、数据抽取、文本搜索和替换等场景。

文章目录

元字符

Python正则表达式中的元字符及其用途:

. (点号)

  • 用途:匹配除换行符 \n 之外的任意单个字符。
  • 示例
    import re
    text = "p\ython\t\n"
    pattern = r"."
    matches = re.findall(pattern, text)
    print(matches)  # 输出: ['p', 'y', 't', 'h', 'o', 'n', '\t']
    
    在这个例子中,. 匹配了每个字符,除了换行符 \n

\w

  • 用途:匹配任何字母数字字符,等同于 [a-zA-Z0-9_]。它包括了所有小写和大写字母、数字以及下划线。
  • 示例
    text = "python\n123"
    pattern = r"\w"
    matches = re.findall(pattern, text)
    print(matches)  # 输出: ['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3']
    
    在这个例子中,\w 匹配了所有的字母和数字,不包括换行符 \n

\W

  • 用途:匹配任何非字母数字字符,等同于 [^a-zA-Z0-9_]。它是 \w 的反义,匹配所有不在 \w 范围内的字符。
  • 示例
    text = "python\n123"
    pattern = r"\W"
    matches = re.findall(pattern, text)
    print(matches)  # 输出: ['\n']
    
    在这个例子中,\W 只匹配了换行符 \n

\s

  • 用途:匹配任何空白字符,包括空格、制表符 \t、换行符 \n 等。
  • 示例
    text = "python\t123"
    pattern = r"\s"
    matches = re.findall(pattern, text)
    print(matches)  # 输出: ['\t']
    
    在这个例子中,\s 匹配了制表符 \t

\S

  • 用途:匹配任何非空白字符,是 \s 的反义。
  • 示例
    text = "python\t123"
    pattern = r"\S"
    matches = re.findall(pattern, text)
    print(matches)  # 输出: ['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3']
    
    在这个例子中,\S 匹配了所有的非空白字符。

\d

  • 用途:匹配任何十进制数字,等同于 [0-9]
  • 示例
    text = "python\t123"
    pattern = r"\d"
    matches = re.findall(pattern, text)
    print(matches)  # 输出: ['1', '2', '3']
    
    在这个例子中,\d 匹配了所有的数字字符。
    这些元字符在正则表达式中非常有用,因为它们可以让你用简洁的方式表达复杂的匹配规则。在实际应用中,你可以将这些元字符与其他正则表达式特性(如量词、分组、断言等)结合起来,以实现更高级的文本处理需求。

限定符

Python正则表达式中的限定符(quantifiers),用于指定前面的元素需要出现的次数。

? (问号)

  • 描述说明: 匹配前面的字符0次或1次。
  • 举例: colou?r
  • 结果: 可以匹配“color”或“colour”。

+ (加号)

  • 描述说明: 匹配前面的字符1次或多次。
  • 举例: colou+r
  • 结果: 可以匹配“colour”或“colouur”等等。

* (星号)

  • 描述说明: 匹配前面的字符0次或多次。
  • 举例: colou*r
  • 结果: 可以匹配“color”或“colouur”等等。

{n} (花括号内为n)

  • 描述说明: 匹配前面的字符恰好n次。
  • 举例: colou{2}r
  • 结果: 可以匹配“colouur”。

{n,} (花括号内为n逗号)

  • 描述说明: 匹配前面的字符至少n次。
  • 举例: colou{2,}r
  • 结果: 可以匹配“colouur”或“colouuur”等等。

{n,m} (花括号内为n逗号m)

  • 描述说明: 匹配前面的字符最少n次,最多m次。
  • 举例: colou{2,4}r
  • 结果: 可以匹配“colouur”、“colouuur”或“colouuuur”。
    这些限定符可以帮助你在进行文本搜索时更加灵活地控制匹配的模式,从而满足不同的需求。
    这张图片展示了Python中的正则表达式(Regular Expressions)的一些基本符号和它们的用途。下面是对这些内容的详细解释:

区间字符 [ ]

  • 描述:匹配方括号中所指定的字符。
  • 举例:[0-9] 匹配数字 0 到 9。

排除字符 ^

  • 描述:匹配不在方括号中指定的字符。
  • 举例:[^0-9] 匹配除了数字 0 到 9 以外的任何字符。

选择字符 |

  • 描述:用于匹配左、右任意一个字符串。
  • 举例:\d{18}|\d{15} 匹配 18 位或 15 位的身份证号码。

*转义字符 *

  • 描述:同 Python 中的转义字符。
  • 用法:将某些字符作为普通字符使用,例如:\ 将反斜杠作为普通字符处理。

汉字匹配 [\u4e00-\u9fa5]

  • 描述:匹配任意一个汉字。
  • 示例:[\u4e00-\u9fa5]+ 可以用来匹配一个或多个汉字。

分组 ()

  • 描述:改变限定符的作用。
  • 举例:six|fourth(six|four)th 匹配 “six” 或 “fourth”,其中 “(six|four)th” 是一个整体被分组的部分。
    这些符号在编写复杂的文本搜索和处理任务时非常有用,可以帮助开发者精确地定义需要匹配的模式。

re模块

re模块是Python标准库中的一个模块,它提供了对正则表达式的支持。正则表达式是一个强大的工具,用于字符串的搜索、替换、匹配等操作。以下是re模块的一些主要功能和函数的详解:

1. 匹配字符

  • .: 匹配除换行符之外的任意字符。
  • [...]: 匹配字符集合中的任意一个字符。
  • [^...]: 匹配不在字符集合中的任意一个字符。
  • \: 转义字符,用于匹配特殊字符或者表示特殊序列。
  • *: 匹配前面的子表达式零次或多次。
  • +: 匹配前面的子表达式一次或多次。
  • ?: 匹配前面的子表达式零次或一次,或指明非贪婪搜索。
  • {m,n}: 匹配前面的子表达式至少m次,不超过n次。

2. re模块的主要函数

re.compile(pattern, flags=0)

编译正则表达式 pattern 为一个正则表达式对象,可以用于后续的匹配。

  • pattern: 要编译的正则表达式。
  • flags: 可选,表示匹配模式,如忽略大小写、多行模式等。
re.search(pattern, string, flags=0)

在字符串中搜索正则表达式的第一个匹配项。

  • pattern: 要搜索的正则表达式。
  • string: 要搜索的字符串。
  • flags: 可选,匹配模式标志。
re.match(pattern, string, flags=0)

从字符串的开始位置匹配正则表达式。

  • pattern: 要匹配的正则表达式。
  • string: 要匹配的字符串。
  • flags: 可选,匹配模式标志。
re.fullmatch(pattern, string, flags=0)

如果整个字符串匹配正则表达式,则返回一个匹配对象,否则返回None

  • pattern: 要匹配的正则表达式。
  • string: 要匹配的字符串。
  • flags: 可选,匹配模式标志。
re.split(pattern, string, maxsplit=0, flags=0)

用正则表达式指定的模式拆分字符串。

  • pattern: 用于拆分的正则表达式。
  • string: 要拆分的字符串。
  • maxsplit: 最大拆分次数。
  • flags: 可选,匹配模式标志。
re.findall(pattern, string, flags=0)

找到字符串中所有正则表达式的非重叠匹配,并以列表形式返回。

  • pattern: 要查找的正则表达式。
  • string: 要搜索的字符串。
  • flags: 可选,匹配模式标志。
re.finditer(pattern, string, flags=0)

找到字符串中所有正则表达式的非重叠匹配,并返回一个迭代器。

  • pattern: 要查找的正则表达式。
  • string: 要搜索的字符串。
  • flags: 可选,匹配模式标志。
re.sub(pattern, repl, string, count=0, flags=0)

替换字符串中与正则表达式匹配的模式。

  • pattern: 要搜索的正则表达式。
  • repl: 替换字符串或一个替换函数。
  • string: 要搜索和替换的字符串。
  • count: 替换的最大次数。
  • flags: 可选,匹配模式标志。
re.escape(string)

转义字符串中的特殊字符。

  • string: 要转义的字符串。

3. 匹配对象

当使用re.search()re.match()等函数时,如果匹配成功,会返回一个匹配对象(Match对象),它具有以下方法和属性:

  • group(): 返回被匹配的字符串。
  • start(): 返回匹配开始的位置。
  • end(): 返回匹配结束的位置。
  • span(): 返回一个元组包含匹配开始和结束的位置。

4. 匹配标志

  • re.I (.IGNORECASE): 忽略大小写。
  • re.M (MULTILINE): 多行模式,^$匹配每一行的开始和结束。
  • re.S (DOTALL): 点任意匹配模式,使.匹配包括换行符在内的任意字符。
  • re.X (VERBOSE): 详细模式,忽略正则表达式中的空白字符并允许加入注释。
    使用re模块进行正则表达式操作时,应该注意正则表达式的编写和匹配标志的正确使用,以确保能够正确地处理字符串。

实操

1. match函数的使用

import re
pattern = '\d\.\d+'  # +限定符,\d 0-9数字出现1次或多次, 点当成普通字符
'''
正则表达式分析
\d: 匹配任何十进制数字(0-9)。
\.: 由于点(.)在正则表达式中是一个特殊字符,它用于匹配除换行符之外的任何单个字符。在这里,我们使用反斜杠(\)进行转义,使得点被当作普通字符处理,即匹配字面上的点(.)字符。
\d+: + 是一个限定符,表示前面的表达式(在这个例子中是 \d)可以出现一次或多次。
所以,整个表达式 '\d\.\d+' 的意思是匹配一个数字,紧接着是一个点,然后是一个或多个数字。
'''
s = 'I study Python 3.11 every day'  # 待匹配字符串
match = re.match(pattern, s, re.I)  # ignore忽略大小写
print(match)  # None为什么:因为match是从头开始匹配的,开头没有数字,不符合查找规则
s2 = '3.11Python I study everyday3.12' # re.match 只在字符串的开始位置进行匹配。一旦找到匹配项,它就不会继续在字符串的其余部分查找。这就是为什么在第二个例子中,尽管 ‘3.12’ 也符合模式,但 re.match 只返回第一个匹配项 ‘3.11’。
match2 = re.match(pattern, s2)
print(match2)
print('匹配值的其实位置:', match2.start())
print('匹配值的结束位置:', match2.end())
print('匹配区间的位置元素:', match2.span())
print('待匹配的字符串:', match2.string)
print('匹配的数据:', match2.group())

None
<re.Match object; span=(0, 4), match=‘3.11’>
匹配值的其实位置: 0
匹配值的结束位置: 4
匹配区间的位置元素: (0, 4)
待匹配的字符串: 3.11Python I study everyday
匹配的数据: 3.11

2. search函数的使用

import re
pattern = '\d\.\d+'
s = 'I study Python3.11 every day Python2.7 I love you'
match = re.search(pattern, s)  # re.search 只会返回第一个匹配的结果
print(match)
print(match.group())

s2 = '4.10 Python I study every day'
match2 = re.search(pattern, s2)
print(match2)
print(match2.group())

s3 = 'I study Python every day'
match3 = re.search(pattern, s3)
print(match3)

<re.Match object; span=(14, 18), match=‘3.11’>
3.11
<re.Match object; span=(0, 4), match=‘4.10’>
4.10
None

3. findall函数的使用

import re
pattern = '\d\.\d+'
s = 'I study Python3.11 every day Python2.7 I love you'
s2 = '4.10 Python I study every day'
s3 = 'I study Python every day'
lst = re.findall(pattern, s)
lst2 = re.findall(pattern, s2)
lst3 = re.findall(pattern, s3)

print(lst)
print(lst2)
print(lst3)

[‘3.11’, ‘2.7’]
[‘4.10’]
[]

4. sub函数使用

import re
# sub替换
pattern = '黑客|破解|反爬'
s = '我想学习python,向破解一些VIP视频,用python可以实现无底线反爬'
new_s = re.sub(pattern, '***', s)
print(new_s)

我想学习python,向一些VIP视频,用python可以实现无底线

5. split函数使用

import re
s = 'https://www.baidu.com/s?wd=aly&rsv_spt=1&rsv_iqid=0xb9b42cc1000bd454&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=ib&rsv_sug3=8&rsv_sug1=12&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=7953&rsv_sug4=7953'
pattern = '[?|&]'  # 分割符
lst = re.split(pattern, s)
print(lst)

[‘https://www.baidu.com/s’, ‘wd=aly’, ‘rsv_spt=1’, ‘rsv_iqid=0xb9b42cc1000bd454’, ‘issp=1’, ‘f=8’, ‘rsv_bp=1’, ‘rsv_idx=2’, ‘ie=utf-8’, ‘tn=baiduhome_pg’, ‘rsv_enter=1’, ‘rsv_dl=ib’, ‘rsv_sug3=8’, ‘rsv_sug1=12’, ‘rsv_sug7=100’, ‘rsv_sug2=0’, ‘rsv_btype=i’, ‘inputT=7953’, ‘rsv_sug4=7953’]

标签:字符,匹配,string,re,python,pattern,正则表达式,详解
From: https://blog.csdn.net/Qhumaing/article/details/144317190

相关文章

  • Python3 函数介绍
    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。定义一个函数你可以定义一个由自己想要功能的函数,以下是简单......
  • Python3 迭代器与生成器
    迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter() 和 next()。字符串,列表或元组对象......
  • Python 推导式说明
    Python推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。Python推导式是一种强大且简洁的语法,适用于生成列表、字典、集合和生成器。在使用推导式时,需要注意可读性,尽量保持表达式简洁,以免影响代码的可读性和可维护性。Python支持各种数......
  • Python语言基础(三):基本数据类型
    前言:在Python的编程世界中,基本数据类型是构建程序的基石。掌握这些核心概念,将为你的编程之路打下坚实的基础。本章,我们将深入探讨这些关键元素,为你的Python之旅提供必要的导航。基本数据类型在内存里存储的数据可以有多种类型。例如:一个人的姓名可以用字符串类型存储,年龄使用数......
  • python毕设 中小学图书管理系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于图书管理系统的研究,现有研究主要以高校或大型图书馆为主,专门针对中小学图书管理的研究较少。在国内外的研究成果中,大型图书馆的管......
  • 《Python 图神经网络编程全指南》
    《Python图神经网络编程全指南》一、引言Python中的图神经网络编程正逐渐成为数据科学和机器学习领域的热门话题。随着数据的日益复杂和多样化,传统的数据分析方法往往难以有效地处理具有复杂关系结构的数据。而图神经网络作为一种新兴的技术,能够很好地捕捉图结构数据中......
  • Python实现菱形
    笔记row=eval(input('请输入菱形的行数:'))whilerow%2==0:#判断行数的奇偶性,行数是偶数,重新输入行数print('请重新输入行数')row=eval(input('请输入菱形的行数:'))#输出菱形top_row=(row+1)//2#上半部分的行数#上半部分foriinrange(1,top_row+1):#......
  • 基于Python+Django的健身房课程预约平台设计与实现
    ......
  • 人工智能学习框架详解及代码案例
    人工智能学习框架详解及代码案例人工智能(AI)学习框架是构建和训练AI模型的基础工具,它们通过预定义的算法、函数和工具,极大地简化了AI应用的开发过程。本文将详细探讨人工智能学习框架的基本概念、分类、优缺点、选择要素、实际应用以及未来发展趋势,并结合代码案例展示其具体......
  • Python内存管理的秘密,你必须知道的高效编程技巧!
    Python内存管理的秘密,你必须知道的高效编程技巧!前言亲爱的Python爱好者们,大家好!......