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

时间:2018-09-17 00:43:09

标签: python regex

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

我的代码:

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

1 个答案:

答案 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(?!,)') ,因此右侧的边界不能跟逗号。

类似地,您可以在断言之后进行查找,这些断言要求匹配的文本前不能加逗号:

(?!,)

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