Python正则表达式findall()函数

本文详细解析了Python中re模块findall函数的使用方法,包括如何处理子组匹配,以及返回列表中元素的构成规则。通过多个示例,深入理解findall在不同正则表达式结构下返回结果的特点。

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

# list = re.findall(regex,string,flag)

import re
string0 = 'abcdefgh'
list0 = re.findall('ab',string0)
print(list0)
# ['ab']


string1 = 'abcdefghab'
list1 = re.findall('ab',string1)
print(list1)
# ['ab', 'ab']


string2 = 'abcdefghab'
list2 = re.findall('(ab)cd',string2)
print(list2)
# ['ab']


string3 = 'abcdefghabcd'
list3 = re.findall('(ab)cd',string3)
print(list3)
# ['ab', 'ab'] 一个字组匹配到两处 只显示子组内容


string4 = 'abcdefghabcd'
list4 = re.findall('(ab)cd(ef)',string4)
print(list4)
# [('ab', 'ef')]

string5 = 'abcdefghabcd'
list5 = re.findall('((ab)cd(ef))',string5)
print(list5)
# [('abcdef', 'ab', 'ef')]  整体匹配到1处,有3个子组

string6 = 'abcdefghabcdef'
list6 = re.findall('(ab)cd(ef)',string6)
print(list6)
# [('ab', 'ef'), ('ab', 'ef')]


# 注意:
# 1.用findall来匹配时,如果正则表达式中没有子组,则返回的列表中的每一项都是匹配到的字符串,匹配到几处就有几个
#
#
# 2.如果正则表达式中含有一个子组,
# 则返回的列表中的各项是匹配到的字符串的子组内容,整体匹配到几处就有几个子组内容
#
#
# 3.如果正则表达式中含有多个子组
# 则返回含有元组的列表
# 正则字符串整体匹配到几处就有几个元组
# 每个元组中的内容是 正则表达式每个子组匹配到的内容
### Python `re.findall` 方法返回空列表的原因 当使用 `re.findall()` 函数时,如果该函数返回一个空列表,通常意味着模式未能匹配到目标字符串中的任何部分。这可能由以下几个原因引起: - **正则表达式模式错误**:所编写的正则表达式无法正确识别预期的目标字符序列[^1]。 - **输入数据不符合期望**:待处理的文本内容并不包含能够被指定模式捕捉的信息。 - **标志位设置不当**:某些情况下,未适当配置多行模式 (`re.M`) 或忽略大小写 (`re.I`) 等标志会影响匹配效果[^3]。 为了更好地理解具体场景下的问题所在,并提供针对性解决方案,下面给出几个常见情况及其对应措施。 #### 正确编写正则表达式 确保所提供的正则表达式的语法准确性至关重要。例如,在尝试提取数字时应采用如下形式: ```python import re pattern = r'\d+' # 匹配至少一位数字 text = '这里有三个数: 123, 456 和789.' result = re.findall(pattern, text) print(result) # 输出 ['123', '456', '789'] ``` 对于更复杂的结构,则需仔细设计模式来适应特定需求。比如要查找带有标签的内容可以这样定义: ```python html_content = '<div>这是一个测试</div><p>另一段文字。</p>' tags_pattern = r'<([a-zA-Z]+)>.*?</\1>' # 使用反向引用 \1 来闭合相同类型的标签 matches = re.findall(tags_pattern, html_content) print(matches) # 只会打印标签名称 ['div', 'p'] 而不是完整HTML片段 ``` #### 验证输入源的有效性 确认传入给 `findall()` 的字符串确实含有可匹配项非常重要。可以通过简单的日志记录或调试语句查看实际传递的数据是否符合预期: ```python input_string = "无有效数值" if not input_string.strip(): print("警告:输入为空白串") else: numbers_found = re.findall(r'\b\d+\b', input_string) if not numbers_found: print(f"注意:'{input_string}' 中没有任何整数.") else: print(numbers_found) ``` #### 合理运用标志参数 有时仅调整正则表达式本身不足以解决问题;此时考虑加入合适的标志可能会有所帮助。特别是涉及跨行或多条件的情况: ```python multiline_text = """ 第一行有编号001, 第二行也有编号002. """ flags = re.MULTILINE | re.IGNORECASE # 多行模式加不区分大小写 number_list = re.findall(r'^第\s*(?P<num>\w+)\s*行', multiline_text, flags=flags) for num in number_list: print(num) # 将分别输出 '一' 和 '二' ``` 通过上述方法之一或组合应用,往往能有效地排查并修正导致 `re.findall()` 返回空列表的问题根源。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值