目标:使用正则表达式(不分割),我想取一串数字,只返回“格式正确”的数字。我定义“格式正确”,因为每三位数必须前面加一个逗号。
我的代码:
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),但是我不确定如何优雅地解决这个问题。
FYI:此示例是对“使用Python自动完成无聊的事情:面向初学者的实用编程”中问题问题的改编。该示例问题仅要求正则表达式找出单个数字的格式是否正确,并且不希望您从一长串多个数字中解析出所有“格式正确”的数字。最初,我对这个问题有误解,现在我正以这种方式完成任务。
答案 0 :(得分:1)
尝试使用否定性环视:
class Reporter:
def __init__(self):
# Maintain a set of reported methods
self._reported = set()
def __call__(self, fn, *args, **kwargs):
# Register method
self._reported.add(fn.__name__)
def decorate(*args, **kwargs):
return fn(*args, **kwargs)
return decorate
class ExampleClass:
report = Reporter()
def get_reports(self):
# return list of all method names with @report decorator
return list(self.report._reported)
@report
def report_x(self):
return
@report
def report_y(self):
return
def method_z(self):
pass
有一个前瞻性断言numRegex = re.compile(r'\b\d{1,3}(?:,\d{3})*\b(?!,)')
,因此右侧的边界不能跟逗号。
类似地,您可以在断言之后进行查找,这些断言要求匹配的文本前不能加逗号:
(?!,)
这样,当“数字”的两边都带有逗号时,将不会被匹配。