首页 > 解决方案 > 正则表达式中边界 \b 的问题

问题描述

目标:使用正则表达式,(不拆分)我想取一串数字,只返回“格式正确”的数字。我将“格式正确”定义为每三个数字必须以逗号开头。

我的代码:

import re
numRegex = re.compile(r'\b\d{1,3}(?:,\d{3})*\b')
print(numRegex.findall('42 1,234 6,368,745 12,34,567 1234'))

当我运行代码时,我希望得到:

['42', '1,234', '6,368,745']

相反,我回来了:

['42', '1,234', '6,368',745', '12', '34,567']

我猜它会将逗号 (,) 视为边界 (\b),但我不确定如何优雅地解决这个问题。

仅供参考:这个例子是对“用 Python 自动化无聊的东西:初学者的实用编程”中的问题问题的改编。示例问题仅要求使用正则表达式来确定单个数字的格式是否正确,并且不希望您从多个数字的长字符串中解析出所有“格式正确”的数字。我最初误解了这个问题,现在我的任务是以这种方式完成它。

标签: pythonregex

解决方案


尝试消极的环顾四周:

numRegex = re.compile(r'\b\d{1,3}(?:,\d{3})*\b(?!,)')

有一个前瞻断言(?!,),因此右侧的边界不能跟逗号。

类似地,您可以有后向断言,要求匹配的文本前面不能有逗号:

numRegex = re.compile(r'(?<!,)\b\d{1,3}(?:,\d{3})*\b(?!,)')

这样,当“数字”的两边都有逗号时,它将不会被匹配。


推荐阅读