首页 > 编程语言 >正则表达式入门:Python ‘ re ‘ 模块详解

正则表达式入门:Python ‘ re ‘ 模块详解

时间:2024-08-20 10:55:08浏览次数:13  
标签:匹配 string Python pattern re 详解 正则表达式 match

正则表达式(Regular Expression,简称 re)是一种强大而灵活的工具,广泛用于字符串匹配、替换和分割等操作,尤其在处理网页爬虫数据时非常有用。Python 提供了 " re " 模块来支持正则表达式的使用,本文将结合常见的用法和示例,带你快速入门。

正则表达式的常用方法

匹配字符串

1. ' search() '
' search() ' 方法用于在字符串中查找符合正则表达式的第一个匹配项。它从字符串的任意位置开始匹配,返回一个 ' Match ' 对象,或者在没有匹配时返回 ' None '。

import re

pattern = r"\d+"  # 匹配一个或多个数字
string = "The price is 100 dollars."

match = re.search(pattern, string)
if match:
    print(f"Found: {match.group()} at position {match.start()}-{match.end()}")
else:
    print("No match found!")

2. ' match() ' 
' match() ' 方法用于从字符串的开头匹配,如果开头不符合正则表达式,则返回 ' None '。

pattern = r"\d+"  # 匹配一个或多个数字
string = "100 dollars"

match = re.match(pattern, string)
if match:
    print(f"Matched: {match.group()}")
else:
    print("No match found!")

3. ' fullmatch() '
' fullmatch() ' 方法要求整个字符串完全符合正则表达式,否则返回 ' None '。

pattern = r"\d+"  # 匹配一个或多个数字
string = "100"

match = re.fullmatch(pattern, string)
if match:
    print(f"Full match: {match.group()}")
else:
    print("No full match!")

4. ' findall() '
' findall() ' 方法返回一个列表,包含字符串中所有符合正则表达式的匹配项。

pattern = r"\d+"  # 匹配一个或多个数字
string = "There are 100 apples and 200 oranges."

matches = re.findall(pattern, string)
print(f"All matches: {matches}")

5. ' finditer() '
' finditer() ' 方法返回一个迭代器,每个元素都是一个 ' Match ' 对象,表示字符串中每一个匹配项。

pattern = r"\d+"  # 匹配一个或多个数字
string = "There are 100 apples and 200 oranges."

matches = re.finditer(pattern, string)
for match in matches:
    print(f"Found: {match.group()} at position {match.start()}-{match.end()}")

替换字符串

1. ' sub() '
' sub() ' 方法用于替换字符串中所有符合正则表达式的部分,返回替换后的新字符串。

pattern = r"\d+"  # 匹配一个或多个数字
string = "There are 100 apples and 200 oranges."
replacement = "many"

new_string = re.sub(pattern, replacement, string)
print(new_string)  # 输出:There are many apples and many oranges.

2. ' subn() '
' subn() ' 方法与 ' sub() ' 类似,但它返回一个元组,包括替换后的字符串和替换次数。

pattern = r"\d+"  # 匹配一个或多个数字
string = "There are 100 apples and 200 oranges."
replacement = "many"

new_string, count = re.subn(pattern, replacement, string)
print(new_string)  # 输出:There are many apples and many oranges.
print(f"Replacements made: {count}")

分割字符串


 1. ' split() '
' split() ' 方法用于根据正则表达式匹配项来分割字符串,返回分割后的列表。

pattern = r"\s+"  # 匹配一个或多个空白字符
string = "This is a test."

parts = re.split(pattern, string)
print(parts)  # 输出:['This', 'is', 'a', 'test.']

正则表达式中的特殊字符

在编写正则表达式时,理解特殊字符的用法非常重要。以下是一些常用的特殊字符:

' \w ':匹配字母、数字、下划线。
' \W ':匹配非字母、数字、下划线的字符。
' \d ':匹配数字

' \D ':匹配非数字字符。
' \s ':匹配空白字符(包括空格、制表符等)。
' \S ':匹配非空白字符。
' . ':匹配除换行符 ' \n ' 之外的任意字符(如果使用 ' re.S ' 标志,可以匹配包括换行符在内的所有字符)。
' ^ ':匹配字符串的开头(如果使用 ' re.M ' 标志,可以匹配每一行的开头)。
' $ ':匹配字符串的结尾(如果使用 ' re.M ' 标志,可以匹配每一行的结尾)。

贪婪与非贪婪匹配

正则表达式中的量词(如 ' * '、' + ' 和 ' ? ')默认情况下是贪婪的,它们会尽可能多地匹配字符。要进行非贪婪(尽可能少的匹配),可以在量词后加上 ' ? '。

' * ':匹配前面的字符 0 次或多次。
' + ':匹配前面的字符 1 次或多次。
' ? ':匹配前面的字符 0 次或 1 次。
' {n} ':匹配前面的字符恰好 n 次。
' {m,n} ':匹配前面的字符至少 m 次,至多 n 次。
' {m,n}? ':非贪婪地匹配前面的字符至少 m 次,至多 n 次。

字符类和分组

' [] ':定义一个字符类,匹配其中的任意一个字符。例如,' [aeiou] ' 匹配任意一个元音字母。
' | ':表示逻辑或,匹配 ' | ' 左右两边的任意一个表达式。例如,' a|b ' 匹配 "a" 或 "b"。
' () ':用于分组,可以将多个字符组合在一起作为一个单元,或者用于提取匹配到的子串。

示例:结合网页爬虫数据解析假设我们正在处理一段 HTML 数据,想要提取所有的 ' <a> ' 标签中的链接。我们可以使用正则表达式来简单地实现这一操作。

import re

html_data = '''
<a href="https://example.com">Example</a>
<a href="https://another-example.com">Another Example</a>
'''

# 正则表达式模式,用于匹配 href 属性中的 URL
pattern = r'href="(https?://[^"]+)"'

# 使用 findall() 提取所有匹配的 URL
urls = re.findall(pattern, html_data)
print(urls)

在这个示例中,' (https?://[^"]+) ' 部分表示匹配 "http://" 或 "https://" 开头,后面跟随任意非引号的字符串,直到下一个引号为止。通过 ' re.findall() ',我们可以轻松提取出所有符合条件的链接。

总结

Python 的 ' re ' 模块提供了强大的正则表达式支持,使得字符串的匹配、替换和分割操作变得非常灵活和高效。无论是在处理爬虫数据还是在其他文本处理任务中,掌握正则表达式都将大大提升你的工作效率。

记住,正则表达式虽然强大,但也容易变得复杂,因此在使用时应尽量保持模式的简洁和可读性。同时,随着经验的积累,你会逐渐发现正则表达式的更多妙用。Happy coding!

标签:匹配,string,Python,pattern,re,详解,正则表达式,match
From: https://blog.csdn.net/m0_74252611/article/details/141332827

相关文章

  • 多重示例详细说明Eureka原理实践
    Eureka原理(EurekaPrinciple)是指在长时间的思考和积累之后,通过偶然的瞬间获得灵感或发现解决问题的方法的一种认知现象。这个过程通常包括三个主要阶段:准备阶段、潜伏期以及突然的灵感爆发。下面详细说明Eureka原理的实践步骤:1.准备阶段广泛阅读与研究:在这个阶段,研究者需......
  • 界面控件DevExpress Blazor v24.2路线图预览——支持.NET 9、新增桑基图等
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。本文中包含了DevExpressBlazorv24.2官方发布的当前/预计的开发计划,请注意......
  • [Base]WTComv-Wavelet Convolutions for Large Receptive Fields
    1.BaseInfoTitleWaveletConvolutionsforLargeReceptiveFieldsAdresshttps://arxiv.org/pdf/2407.05848Journal/TimeECCV2024Author以色列本古里安Codehttps://github.com/BGU-CS-VIL/WTConv2.CreativeQ&A卷积核7x7时性能饱和。卷积层CNN响应高频较多,Attent......
  • C语言:一维、二维数组详解
    目录一、数组的概念二、一维数组创建和初始化2.1数组创建2.2数组的初始化2.3数组的类型三、一维数组的使用3.1数组的下标3.2数组的输入与输出四、⼀维数组在内存中的存储五、sizeof计算数组元素个数六、二维数组6.1二维数组的概念6.2二维数组的创建6.3二......
  • 定义Person 类,里面有name、age属性,并提供compareTo 比较方法, 用于判断是否和另一个人
    1publicclassthisdetail{2//编写一个main方法3publicstaticvoidmain(String[]args){45Personp1=newPerson("mary",20);6Personp2=newPerson("mary",30);78System.out.println("......
  • kworker和kthread
    kworker和kthread都是Linux内核中的组件,它们在内核中扮演着不同的角色,但也有着一定的联系。kworker定义与功能:定义:kworker是Linux内核中的一个工作线程,用于异步处理工作队列(workqueue)中的任务。这些任务包括但不限于处理硬件中断、文件系统事件、管理系统内存等。功能:kworker......
  • python列表方法-insert、pop、remove
    1.pop方法python中pop方法从列表中删除一个元素(默认是最后一个元素),并且返回这个元素a=[100,200,300,400]a.pop()400a[100,200,300]列表a调用pop方法,删除最后一个元素400返回。2.insert方法python中insert方法用于将一个对象插入列表a=[100,200,300,400]a.inse......
  • Python 面向对象(笔记)
    一、函数的概念函数用于在程序中分离不同的任务,是模块化程序设计的基本构成单位,是对程序逻辑进行结构化或过程化的一种编程方法函数定义好后,可以反复调用使用,这样就可以避免重复编写代码,而且,功能如果需要修改,只要更改函数定义就可以,维护方便1.1使用函数的优点 实现结......
  • 大白话讲【1.1】redhat 9采用nmtui快速配置Ipv4(网卡已有配置文件前提下)
    0.环境查看:[root@lili~]#uname-aLinuxlili5.14.0-70.13.1.el9_0.x86_64#1SMPPREEMPTThuApr1412:42:38EDT2022x86_64x86_64x86_64GNU/Linux[root@lili~]#ifconfig|head-2ens160:flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu1500     ......
  • PostgreSQL之继承
    继承表PostgreSQL支持表继承,这是一种将多个表组织成一个继承层次结构的方式。在表继承中,一个父表可以定义一组共享的列和约束,并可以有多个子表继承这些定义,并可以添加自己的额外列和约束。下面是关于如何使用PostgreSQL继承表的一些重要概念和用法:CREATETABLEemployees(......