正则表达式中的边界\ b问题

问题描述 投票:0回答:1

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

我的代码:

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

python regex
1个回答
1
投票

尝试负面的看法:

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

有一个先行断言(?!,),以便右侧的边界不能跟一个逗号。

类似地,您可以使用lookbehind断言,这些断言要求匹配的文本前面没有逗号:

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

这样,当“数字”在其两侧都有逗号时,它将不匹配。

© www.soinside.com 2019 - 2024. All rights reserved.