【问题标题】:regular expression findall errors [duplicate]正则表达式查找所有错误[重复]
【发布时间】:2018-08-02 03:41:31
【问题描述】:

我运行以下脚本

a = r'[abc] [abc] [y78]'
paaa = re.compile(r'\[ab.*]')
paaa.findall(a)

我得到了

['[abc] [abc] [y78]']

为什么缺少“[abc]”? '[abc]' 也清楚地匹配模式。 python3 re.findall函数有bug吗?

澄清:

抱歉paaa 应该是paaa = re.compile(r'\[ab.*\]') 我正在寻找的是会返回的东西

['[abc]', '[abc]', '[abc] [abc]', '[abc] [abc] [y78]']

基本上,任何子字符串都匹配模式。

【问题讨论】:

  • 如果您想以包含abc 的任何括号开头,为什么不将[abc] [y78] 也包含在您的结果中?

标签: python regex findall


【解决方案1】:

[ab.*] 中重复的.贪婪 - 它会匹配尽可能多的字符,以便这些字符后面跟一个]。因此,第一个 [ 和最后一个 ] 之间的所有内容都匹配。

改用惰性重复,.*?:

a = r'[abc] [abc] [y78]'
paaa = re.compile(r'\[ab.*?]')
print(paaa.findall(a))
['[abc]', '[abc]']

【讨论】:

  • 抱歉 paaa 应该是 paaa = re.compile(r'\[ab.*\]') 我正在寻找的东西会返回 ['[abc]', '[abc]', '[abc] [abc]', '[abc] [abc] [y78]'] 基本上,任何子字符串都匹配模式。
【解决方案2】:

您也应该转义右方括号,并在您的正则表达式中使用非贪婪转发器*?

import re
a = r'[abc] [abc] [y78]'
paaa = re.compile(r'\[ab.*?\]')
print(paaa.findall(a))

这个输出:

['[abc]', '[abc]']

【讨论】:

  • “你也应该转义右方括号” - 不需要。
  • 抱歉 paaa 应该是 paaa = re.compile(r'\[ab.*\]') 我正在寻找的是会返回 ['[abc]', '[abc]', '[abc] [abc]', '[abc] [abc] [y78]'] 基本上,任何子字符串都匹配模式。
猜你喜欢
  • 1970-01-01
  • 2015-12-26
  • 2021-11-01
  • 1970-01-01
  • 2019-01-16
  • 2013-01-19
  • 2013-10-27
  • 1970-01-01
  • 2013-10-05
相关资源
最近更新 更多