0

这是我的字符串:

"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-1from ab-1,当它应该获得最多 2 个字符的最大可能匹配时,ab-1

有任何想法吗?

4

2 回答 2

3

应该有:

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

该表达式[\w{1,2}]表示任何单个字符,它可以是单词字符 , {, 1, ,,2}.

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

于 2013-04-22T19:22:42.367 回答
1

此正则表达式应如下所示:

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

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

\b由于这个例子,RE的边界也应该有: ffff-123.

RE without\b将匹配此示例的部分,但它不应该因此我们添加\b使其仅在单词的边界处搜索

于 2013-04-22T19:37:13.160 回答