Python3 re.findall()方法 及 re.compile()

本文深入解析re.findall()函数的使用方法,通过实例演示如何在字符串中查找所有匹配的子串,同时探讨re.compile()的复用优势及findall()在括号使用上的常见陷阱。

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

re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表;如果没有找到匹配的,则返回空列表。

返回结果是列表类型,需要遍历一下才能依次获取每组内容。

findall(patern, string, flags=0)
  • pattern : 正则中的模式字符串。
  • string : 要被查找替换的原始字符串。
  • flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

1,例子:

import re


content = 'Hello 123456789 Word_This is just a test 666 Test'
results = re.findall('\d+', content)    

print(results)
for result in results:
    print(result)

结果:

['123456789', '666']
123456789
666

Process finished with exit code 0

注意利用re.findall()函数没有group()和groups(),因为其返回结果是一个列表。

 

2,re.compile()方法

re.compile()方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。

re.compile(pattern[, flags])

re.compile()中可以传入忽略换行等匹配模式,这样在search()、findall()方法中就不需要额外传入了。

 

因此,re.findall()方法有2种表达方式:

import re


content = 'one1two22three333four4444'
pattern = re.compile(r'\d+')
print('===方法1:===')
result1 = re.findall(pattern, content)
print(result1)

print('===方法2===')
result2 = pattern.findall(content)
print(result2)

结果:

===方法1:===
['1', '22', '333', '4444']
===方法2===
['1', '22', '333', '4444']

Process finished with exit code 0

 

3,在使用findall()方法时的“坑”:注意正则表达式中括号()的使用

(1)正则表达式中当没有括号时,正常匹配:

import re


str1 = '2345  3456  4567  5678  6789'
pattern_1 = re.compile('\w+\s+\w+') # \w 表示匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
print(pattern_1.findall(str1))

结果:

['2345  3456', '4567  5678']

Process finished with exit code 0

(2)正则表达式中有一个括号时,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果:

import re


str1 = '2345  3456  4567  5678  6789'
pattern_1 = re.compile('(\w+)\s+\w+') # \w 表示匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
print(pattern_1.findall(str1))

结果:

['2345', '4567']

Process finished with exit code 0

        整个正则表达式执行了,只不过只输出括号匹配到的内容,即输出的是第一个 (\w+) 匹配到的内容:

在第一次匹配时跟上述没有括号时一样,匹配到"2345 3456",只不过只输出(/w+)匹配到的结果 即"2345";

第二次匹配同理,从"4567" 开始,匹配到"4567  5678",但是还是只是输出(/w+)匹配到的结果 即"4567"。

(3)当正则表达式中有两个括号时,其输出是一个list 中包含2个 tuple:

import re


str1 = '2345  3456  4567  5678  6789'
pattern_1 = re.compile('((\w+)\s+\w+)') # \w 表示匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
print(pattern_1.findall(str1))

结果:

[('2345  3456', '2345'), ('4567  5678', '4567')]

Process finished with exit code 0

        从输出的结果可以看出,结果中包含两个元组,每一个元组中有两个字符串。

第一个元组是第一次匹配的结果,其中的第一个字符串 "2345 3456" 是正则表达式最外面的括号

((\w+)\s+\w+)

匹配输出的结果;

第一个元组中的第二个字符串 "2345"是正则表达式里面括号

(\w+)

匹配输出的结果 ;

第二个元组是第二次匹配的结果,匹配原理与第一次匹配相同。

 

参考:

https://blog.csdn.net/YZXnuaa/article/details/79346963

https://blog.csdn.net/zd147896325/article/details/79010621

https://www.cnblogs.com/one-lightyear/p/6814833.html

 

re.findall()Pythonre模块提供的一个函数,用于通过正则表达式在字符串中查找所有匹配的子串,并返回一个列表。 re.findall()函数有两种调用方式。一种是直接使用re.findall(pattern, string)的形式,其中pattern是用来匹配的正则表达式,string是要匹配的字符串。另一种是先使用re.compile(pattern)正则表达式编译成一个模式对象,然后再使用模式对象的findall(string)方法进行匹配。 在使用re.findall()函数时,如果正则表达式中使用了括号来分组,那么返回的结果只会包含括号中的内容。如果没有使用括号,那么相当于在最外层增加了一个括号,返回的结果将包含整个匹配到的子串。 举个例子,假设有一个字符串str = &#39;aabpythonbaregexa,aabpythonbacoola&#39;,我们想要找到其中所有以&#39;a&#39;开头,以&#39;a&#39;结尾的子串,可以使用re.findall(r&#39;a(.*?)a&#39;, str)来实现。这个表达式中使用了括号来分组,返回的结果将只包含括号中的内容,即[&#39;python&#39;, &#39;bacool&#39;]。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Pythonre正则表达式](https://blog.csdn.net/m0_67601373/article/details/126044659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [python正则表达式re模块之findall函数](https://blog.csdn.net/liuweiyuxiang/article/details/126100245)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值