Python中使用正则表达式

本文介绍了正则表达式的概念及常用的语法元素,包括字符、预定义字符集、数量词等,同时提供了Python中re模块的基本操作方法,如compile、match、search、findall、sub和split,帮助读者快速掌握正则表达式的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

下表整理了一些正则表达式中经常用到的语法:

 语法描述表达式示例匹配示例
字符普通字符匹配自身abcabc
\t匹配一个制表符  
\r匹配一个回车符  
\n匹配一个换行符  
\f匹配一个换页符  
\v匹配一个垂直制表符  
.匹配任意除换行符'\n'外的字符
在DOTALL模式中也能匹配换行符
a.cabc
^匹配输入字符串的开始位置  
$匹配输入字符串的结束位置  
\b匹配一个单词边界,即字与空格间的位置  
\B匹配非单词边界  
|指明两项之间的选择一个  
[...]字符集,对应的位置可以是字符集中任意字符。
字符集中的字符可以逐个列出,也可以给出范围,例如 [abc]或者[a-c]。
第一个字符如果是 ^ 则表示取反,如 [^abc]表示除abc外的任意字符。
所有的特殊字符在字符集中都失去原有的特殊含义。在字符集中如果要使用 ]、- 、^,可以在前面加上反斜杠,或把 ] 、- 放在第一个字符,把 ^ 放在非第一个字符。
a[]a-z\[\-^]ca[c
a]c
abc
a-c
a^c
预定义字符集\d数字:[0-9]a\dca6c
\D非数字:[^0-9] 或者[^\d]a\Dcabc
\s空白字符:[空格\t\r\n\f\v]a\sca c
\S非空白字符:[^\s]a\Scabc
\w单词字符:[A-Za-z0-9_]a\wca_c
\W非单词字符:[^\w]a\Wca c
数量词*匹配前一个字符任意次(0次、1次、...)abc*dabd
abccd
+匹配前一个字符1次或多次abc+dabcd
abccd
?匹配前一个字符0次或1次abc?dabd
abcd
{n}
{n,}
{n,m}
匹配前一个字符n次
匹配前一个字符至少n次  
匹配前一个字符至少n次,最多m次
abc{3}dabcccd

注意:*、+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。

Python 自1.5版本起增加了re 模块,使得 Python 语言拥有全部的正则表达式功能,常用正则表达式的方法有如下几个:

  • re.compile(pattern, flags=0) # 编译,获取一个正则表达式对象用于匹配和替换
  • pattern.match() # 对整个字符串进行匹配
  • pattern.search() # 找一个
  • pattern.findall() # 找所有
  • pattern.sub() # 替换

compile方法中的 flags 参数用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

match方法

match方法尝试从字符串的起始位置与模式进行匹配,如果匹配成功的话,会返回一个包含了所有匹配分组的结果对象,否则返回None。 

import re

match_str = 'Cats are smarter than dogs'
match_pattern = re.compile(r'(.*) are (.*?) .*', re.M | re.I)
match_ret = match_pattern.match(match_str)

if match_ret:
    print("match_ret.group(0) : ", match_ret.group(0))
    print("match_ret.group(1) : ", match_ret.group(1))
    print("match_ret.group(2) : ", match_ret.group(2))
else:
    print("No match!!")

print(match_ret.groups())

程序打印结果:

match_ret.group(0) :  Cats are smarter than dogs
match_ret.group(1) :  Cats
match_ret.group(2) :  smarter
('Cats', 'smarter')

search方法

search方法会从左至右扫描整个字符串并返回第一个与模式匹配成功的部分字符串。

import re

search_str = 'Big fish eat small fish, small fish eat shrimp'
search_pattern = re.compile(r'(.*) fish .*', re.M | re.I)
search_ret = search_pattern.match(search_str)

if search_ret:
    print("search_ret.group(0) : ", search_ret.group(0))
    print("search_ret.group(1) : ", search_ret.group(1))
else:
    print("No search!!")

 程序打印结果:

search_ret.group(0) :  Big fish eat small fish, small fish eat shrimp
search_ret.group(1) :  Big fish eat small fish, small

findall方法

findall方法会在字符串中找到与模式匹配的所有子串,并返回一个列表,如果没有找到匹配的字符串,则返回空列表。

import re

find_str = 'Big fish eat small fish, small fish eat shrimp'
find_pattern = re.compile(r'(\S* fish)', re.M | re.I)
find_ret = find_pattern.findall(find_str)
print(find_ret)

程序打印结果: 

['Big fish', 'small fish', 'small fish']

另外还有一个finditer方法和findall很类似,也是在字符串中找到正则表达式所匹配的所有子串,但是会把它们作为一个迭代器返回。

find_str = 'Big fish eat small fish, small fish eat shrimp'
find_pattern = re.compile(r'(\S* fish)', re.M | re.I)


iter = find_pattern.finditer(find_str)
for match in iter:
    print(match.group())

sub方法

sub方法用来使用正则表达式对与模式匹配的子串进行替换,可以通过count参数来指定替换次数。

import re

sub_str = 'Big fish eat small fish, small fish eat shrimp'
sub_pattern = re.compile(r'(\S* fish)', re.M | re.I)
sub_ret = sub_pattern.sub('fish', sub_str, count=3)
print(sub_ret)

程序打印结果: 

fish eat fish, fish eat shrimp

 与sub方法类似地,有一个split方法能够利用与正则模式匹配的子串将字符串进行分割并将分割后的结果放入列表返回。

split_str = 'Big fish eat small fish, small fish eat shrimp'
split_pattern = re.compile(r'(\S* fish)', re.M | re.I)
split_ret = split_pattern.split(sub_str,maxsplit=0)
print(split_ret)

程序打印结果: 

['', 'Big fish', ' eat ', 'small fish', ', ', 'small fish', ' eat shrimp']

 

Python使用正则表达式非常方便,因为Python内置了一个名为`re`模块来支持这个功能。以下是关于如何在Python中运用正则表达式的简要介绍: ### 导入 re 模块 首先需要导入 `re` 库,这是操作所有与正则相关的函数的基础步骤。 ```python import re ``` ### 编译正则表达式 虽然可以直接将字符串作为参数传递给`re`库里的各个方法,但更推荐的方式是先创建一个Pattern对象(即编译后的正则表达式),然后再进行匹配或其他处理。这样做有助于提升效率,尤其是在多次使用相同的模式时。 ```python pattern = re.compile(r'\d+') # 匹配数字序列 ``` ### 进行搜索和替换 #### search() 和 match() - `match()` 函数只检查是否从头开始匹配成功; - 而 `search()` 则会在整个字符串里寻找第一个符合条件的位置。 两者返回的结果都是Match对象,如果没有找到匹配项,则返回None。 ```python result = pattern.search('example123string') if result: print("Found:", result.group()) else: print("No match") ``` #### sub() 替换文本内容 如果你想把某些部分替换成别的东西,可以用sub()来做。它接受三个参数:一个是旧的模式、二是新的值以及三是目标字符串。 ```python new_text = re.sub(r'\s+', ' ', text) # 将连续空白符改为单空格 print(new_text) ``` 此外还有其他一些常用的函数如 findall(), split() 等等可以根据实际需求选择合适的方法去解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值