2013-04-22 54 views
0

這裏是我的字符串:正則表達式來多次匹配越好,但限制範圍內

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

我想挑出來的東西有:

  • 最多2個字母
  • 可選連字符
  • 最多2個號碼

  • 有效:AB1,AB1,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-1ab-1,當它應該得到最大可能的比賽最多2個字符,ab-1

任何想法?

+0

你想邊緣的情況下,即令牌匹配,如「AB- 「或」-45「,甚至」 - 「?目前發佈的問題留作解釋。如果這樣做,這將打破依賴Barmar和其他人提出的詞邊界錨(\ b)的正則表達式。 – dpodbori 2013-04-22 19:43:56

回答

3

的RE應該是:

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

表達[\w{1,2}]指任何單個字符要麼單詞字符,{1,2,或}

請注意,在您的字符串中,這將匹配ff-12,因爲這部分ffff-123與表達式匹配。如果您不希望發生這種情況,則需要在表達式周圍添加\b,以便它僅在字邊界處匹配。

+0

謝謝!這很好,但添加了\ b打破了它。我在這裏做錯了什麼? \ b [az] {1,2} - ?\ d {1,2} – LittleBobbyTables 2013-04-22 19:31:03

+1

請確保您使用原始字符串,即'r'\ b [az] {1,2} - ?\ d {1,2} '',這樣反斜槓不會被字符串解析器使用。 – Barmar 2013-04-22 19:36:56

1

此正則表達式應該看起來像:

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

這是因爲\w所有α-數字符號,包括所有你不想在你的字符串,找到數字的匹配。

由於這個例子,還應該有RE的邊界上的\bffff-123

RE沒有\b將匹配這個例子中的一部分,但它不應該,所以我們增加\b,使其只在字的邊界搜索

+0

感謝您的回覆!這是完美的,但巴爾馬第一次到達那裏,所以我必須給他upvote :) – LittleBobbyTables 2013-04-22 19:38:11

+0

沒問題:)(至少我已經得到了我的10點聲望點) – 43l0v3k 2013-04-22 19:41:27