正则表达式尽可能多地匹配,但在限制范围内

时间:2013-04-22 19:18:02

标签: regex regex-greedy

这是我的字符串:

"ab1 ab-1 f-12 g-12 ffff-123 456"

我想挑选出具有以下内容的内容:

  • 最多2个字母
  • 可选连字符
  • 最多2个数字

  • 有效:ab1,ab-1,f-12,g-12

  • 无效:ffff-123,456

所以我创建了正则表达式:

[\w{1,2}]-?\d{1,2}

但它返回太多东西:

>>> re.findall('[\w{1,2}]-?\d{1,2}', "ab1 ab-1 f-12 g-12 ffff-123 456")
['b1', 'b-1', 'f-12', 'g-12', 'f-12', '456']

问题:

  1. [\w{1,2}]需要与-?隔离.....我认为他们被困在一起
  2. [\w{1,2}]获得尽可能小的匹配,例如来自b-1的{​​{1}},当它最多可能匹配2个字符时,ab-1
  3. 有什么想法吗?

2 个答案:

答案 0 :(得分:3)

RE应该是:

[a-z]{1,2}-?\d{1,2}

表达式[\w{1,2}]表示任何一个字符,即{1,2}

请注意,在您的字符串中,这将与ff-12匹配,因为ffff-123的此部分与表达式匹配。如果您不希望发生这种情况,则需要在表达式周围添加\b,以便它只在字边界处匹配。

答案 1 :(得分:1)

这个正则表达式应该是这样的:

\b[a-z]{1,2}-?[\d]{1,2}\b

这是因为\w匹配所有alpha- 数字符号,包括您​​不希望在字符串中找到的所有数字。

由于此示例,因此在RE的边界上应该有\bffff-123

没有\b的RE会与此示例的部分匹配,但不应该这样,我们添加\b以使其仅搜索单词的边界