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