python - Python 正则表达式 findall 函数仅返回组匹配而不是完整字符串
问题描述
给定字符串bcacaca。正则表达式模式b?(.a)*
应该匹配整个字符串。但是,调用会re.findall('b?(.a)*', 'bcacaca')
返回['ca', '']
结果。它似乎只返回单个组的匹配结果。这里发生了什么?
我的理解findall
是它应该返回正则表达式模式的所有非重叠实例。在这种情况下,它应该返回['bcacaca', '']
。
解决方案
改为'(b(.a)*)'
用作您的正则表达式模式。您需要result[0]
在以下示例中。
import re
result = re.findall('(b(.a)*)', 'bcacaca')
result
输出:
[('bcacaca', 'ca')]
更好的选择 - 使用非捕获组
正如@Nick 提到的,可以在此处使用非捕获组,如下所示。考虑以下场景。有关分步说明,请参阅下一节。另外,我鼓励您使用此资源:regex101.com。
## Define text and pattern
text = 'bcacaca dcaca dbcaca'
pattern = 'b?(?:.a)*'
## Evaluate regex
result = re.findall(pattern, text)
# output
# ['bcacaca', '', '', 'caca', '', '', 'bcaca', '']
## Drop empty strings from result
result = list(filter(None, result))
# output
# ['bcacaca', 'caca', 'bcaca']
使用非捕获组说明
参考
推荐阅读
- .htaccess - htaccess 需要帮助重写 url 和改进代码
- ruby-on-rails - 在 Rails 中查找 ActiveRecord 命令不起作用
- .htaccess - 我已强制网站使用 HTTPS,但现在 URL 中有 ?url=/
- google-cloud-firestore - Firestore 模拟器和调试安全规则
- javascript - GraphQL Mutation 的 onCompleted() 给出控制台错误
- reactjs - React – 在类组件中使用 auth0 用户数据
- javascript - 我需要为 forEach 做什么
- python - 我可以将这两行合并为一行吗?
- javascript - 如何获取活动按钮 ref 属性并将其分配给 vue.js 中的变量
- pine-script - Tradingview - 在满足平局条件时设置警报