【正则】findall分组匹配的捕获组与非捕获组

一、产生问题

使用findall匹配的时候如果正则表达式中使用了分组,返回值为列表形式,并且往往和想要得到的结果相差许多
例如在前文的ip匹配中,基本正则表达式为:

r'\D(\d{1,3}\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\D'

这个正则表达式如果使用findall进行正则匹配,结果如下:

import re
str = "we1764.12.12.76frg45.23.278.34hrdf127.0.0.1jj255.45.45.45bght"
result = re.findall(r'\D(\d{1,3}\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\D',str)
print(result) 
### Python `re.findall` 的贪婪匹配行为 在 Python 中,正则表达式模块 `re` 提供了强大的工具来处理字符串中的模式匹配。其中,`re.findall()` 是一个常用的方法,用于查找所有与给定正则表达式模式相匹配的内容,并将其作为列表返回。 #### 贪婪匹配的行为 默认情况下,正则表达式中的量词(如 `*`, `+`, `{n,}` 等)是贪婪的,这意味着它们会尽可能多地匹配字符[^2]。例如,在模式中使用 `.*` 时,它会尝试匹配从当前位置到字符串结尾之间的所有字符。 以下是一个具体的例子: ```python import re text = "<tag>content</tag>" pattern_greedy = r"<.*>" # 使用贪婪匹配 result_greedy = re.findall(pattern_greedy, text) print(result_greedy) # 输出: ['<tag>content</tag>'] ``` 在这个例子中,由于 `.*` 是贪婪的,因此它不仅匹配 `<tag>` 和 `</tag>` 之间的一部分内容,而是扩展到了整个标签范围内的所有字符。 #### 贪婪匹配的行为对比 如果希望减少匹配的数量,则可以将量词改为贪婪形式。通过在量词后面添加问号 `?` 实现这一点。这样可以让正则表达式引擎优先考虑更短的匹配结果。 以下是相同的场景下采用贪婪匹配的例子: ```python pattern_non_greedy = r"<.*?>" # 使用贪婪匹配 result_non_greedy = re.findall(pattern_non_greedy, text) print(result_non_greedy) # 输出: ['<tag>', '</tag>'] ``` 在这里,`.*?` 表示尽可能少地匹配字符,从而分别捕获两个独立的标签而不是整体作为一个单元。 #### 更复杂的分组情况下的贪婪/贪婪影响 当涉及到多个分组或者复杂结构的时候,理解每部分是否采取贪婪策略变得尤为重要。比如下面这个例子展示了如何利用括号来进行子模式定义并观察不同匹配方式的影响: ```python str_sample = 'A B C D' pattern_grouped_greedy = re.compile(r"\w+\s+\w+") lists_grouped_greedy = pattern_grouped_greedy.findall(str_sample) pattern_first_only_non_greedy = re.compile(r"(\w+)\s+\w+") lists_first_only_non_greedy = pattern_first_only_non_greedy.findall(str_sample) pattern_both_groups_non_greedy = re.compile(r"(\w+)\s+(\w+)") lists_both_groups_non_greedy = pattern_both_groups_non_greedy.findall(str_sample) print(lists_grouped_greedy) # 输出: ['A B', 'C D'] (贪婪匹配两对单词组合) print(lists_first_only_non_greedy) # 输出: ['A', 'C'] (仅获取第一个单词,因为第二个被忽略掉) print(lists_both_groups_non_greedy)# 输出: [('A', 'B'), ('C', 'D')] (分别得到前后配对的结果) ``` 以上代码片段说明了即使是在简单的情况下,调整贪婪程度也能显著改变最终获得的数据集合[^4]。 ### 结论 综上所述,掌握好正则表达式的贪婪与贪婪特性对于精确控制数据抓取至关重要。合理运用这些概念可以帮助开发者更加灵活高效地完成各种文本解析任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值