正则表达式匹配5位数字子串未用数字括起来

时间:2017-01-23 13:46:38

标签: python regex

我想从字符串

中提取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)

2 个答案:

答案 0 :(得分:5)

您与((\D|^)*)\d\d\d\d\d((\D|$)*)一起使用的当前正则表达式(re.findall)不会返回数字块,因为它们未被捕获。更多,(\D|^)*(\D|$)*部分可选,这意味着他们没有做他们应该做的事情,正则表达式会在更长的数字块中找到5个数字块。

如果您必须找到未包含其他数字的5位数字块,请使用

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

请参阅regex demo

<强>详情:

  • (?<!\d) - 当前位置之前不允许数字
  • \d{5} - 5位数
  • (?!\d) - 当前位置后不允许数字。

答案 1 :(得分:4)

使用word boundary (\b),匹配单词的开头/结尾:

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

\d\d\d\d\d可以替换为\d{5}

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

更新如果您需要从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']