2017-01-23 172 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

相关问题