2017-01-23 176 views
3

我想從字符串中提取5個連續數字正則表達式匹配不包含數字的5位子字符串

我寫的代碼。

re.findall(r"((\D|^)*)\d\d\d\d\d((\D|$)*)", s) 

但它不能傳遞字符串

"Helpdesk-Agenten (m/w) Kennziffer: 12966" 

預期的結果是:

12966 

實施例2:

#input 
"Helpdesk-Agenten (m/w) Kennziffer: 12966abc" 
# expected 
12966 

實施例3:

#input 
"Helpdesk-Agenten (m/w) Kennziffer: 12966345" 
# expected 
"" (because the length of continuous digits is longer than 5) 
+1

也許你可以提供更多的比賽例子?它應該匹配12345abc嗎? –

+0

@讓FrançoisFabre感謝您的意見,增加了兩個例子 –

+0

這裏是另一個類似的問題http://stackoverflow.com/questions/16348538/python-regex-for-int-with-at-least-4-digits – Kasramvd

回答

5

re.findall使用將不會返回數字塊,因爲他們不是您當前的正則表達式(((\D|^)*)\d\d\d\d\d((\D|$)*))抓獲。更多的(\D|^)*(\D|$)*部分是可選,這意味着他們沒有做他們應該做的,正則表達式會發現5個塊內不再數字塊。

如果你必須找到5位塊不附帶其他數字,使用

re.findall(r"(?<!\d)\d{5}(?!\d)", s) 

regex demo

詳細

  • (?<!\d) - 沒有數字是之前所允許的當前位置
  • \d{5} - 5位數字
  • (?!\d) - 當前位置後不允許有數字。
+0

Stribizew謝謝你的回答 –

4

使用word boundary (\b),字/結尾如同在開頭其中:如果您需要

>>> re.findall(r"\b\d{5}\b", "Helpdesk-Agenten (m/w) Kennziffer: 12966") 
['12966'] 

UPDATE

>>> re.findall(r"\b\d\d\d\d\d\b", "Helpdesk-Agenten (m/w) Kennziffer: 12966") 
['12966'] 

\d\d\d\d\d可以\d{5}更換得到12966滿分12966abc ,請參閱WiktorStribiżew的回答,該回答使用負面的查找斷言。

>>> [match.group(2) for match in re.finditer(r'(\D|^)(\d{5})(\D|$)', '12345abc')] 
['12345'] 

或組合簡單的正則表達式與列表理解:

>>> [match for match in re.findall(r'\d+', '12345abc') if len(match) == 5] 
['12345'] 
+5

的邊界表達式將不匹配「12966abc」中的5個數字... – schwobaseggl

+0

@schwobaseggl,謝謝您指出這一點。我會更新答案。 – falsetru

+0

@schwobaseggl,WiktorStribiżew提出了我要發佈的解決方案,所以我更新了另一個解決方案。 – falsetru

相關問題