正则表达式匹配5位子字符串,不包含数字

2024-04-20 15:09:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从字符串中提取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)

Tags: ofthe字符串代码reinput数字length
2条回答

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)-当前位置后不允许有数字。你知道吗

使用word boundary (^{}),匹配单词的开头/结尾:

>>> 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']

更新如果您需要从12966abc中获得12966,请参阅Wiktor Stribiżew的答案,该答案使用了否定的lookaround断言。你知道吗

或者

>>> [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']

相关问题 更多 >