正则表达式固定宽度字段(Regex for fixed width field)

2019-07-02 18:09发布

我需要与正则表达式上的文件布局匹配的固定宽度字段。 该字段是数字/整数,总是有四个字符和被包括在0..1331的范围内。 当数量小于1000,串充满了左零。 因此,所有这些例子是有效的:

  • 0000
  • 0001
  • 0010
  • 1000年
  • 1331

但必须按下列接受:

  • 1
  • 01
  • 10
  • 100
  • 4759

这将是很好,如果我能强制执行此限制只用正则表达式。 打了一下后,我得到表达\0*[0-1331]\ 。 问题是,它没有大小限制为四个字符。 当然,我可以做\000[0-9]|00[10-99]|0[100-999]|[1000-1331]\但我拒绝使用东西这么讨厌。 谁能想到一个更好的办法?

Answer 1:

正则表达式是不回答一个问题。 我的建议是做一些事情,如:

boolean isValidSomethingOrOther (string):
    if string.length() != 4:
        return false
    for each character in string:
        if not character.isNumeric():
            return false
    if string.toInt() > 1331:
        return false
    return true

如果必须使用正则表达式,没有什么不对您的解决方案,但我可能会用下面的变种(只是基于我的RE引擎的理解,以及他们如何工作):

^0[0-9]{3}|1[0-2][0-9]{2}|13[0-2][0-9]|133[01]$
  • 首节比赛0000-0999。
  • 第二匹配1000年至1299年。
  • 第三匹配1300年至1329年。
  • 最后一节比赛1330和1331。

更新:

刚上优雅评论,还有优雅的多种形式,其中正则表达式是一个。 你也可以通过抽象验证出一个单独的函数或宏,然后从你的代码中调用它实现优雅:

if isValidSomethingOrOther(str) ...

其中SomethingOrOther是一个具体的业务对象。 这使您可以轻松地改变你的有效目标的想法,即使使用正则表达式,你的愿望,或者你认为任何其他检查适当的(如我上面的功能)。

这使您可以应付任何改变上下行等,这些现在反对必须是素数的要求。

我敢肯定,我可以写一个“黄金数低于1332”正则表达式。 我同样相信,我不会 -我更喜欢编写了一个函数(或原始速度查找表),特别是因为正则表达式将最有可能只是看起来像:

^2|3|5|7| ... |1327$

无论如何。



Answer 2:

这似乎太容易了,我在正确认识这个问题?

\[01][0-9]{3}\

我不知道..是什么意思,在范围的整数? 这必须是一个perlism什么的。

这似乎是工作,你要我的方式:

In [3]: r = re.compile(r'[01][0-9]{3}')

In [4]: r.match('0001')
Out[4]: <_sre.SRE_Match object at 0x2fa2d30>

In [5]: r.match('1001')
Out[5]: <_sre.SRE_Match object at 0x2fa2cc8>

In [6]: r.match('2001')

In [7]: r.match('001')

In [8]: 


文章来源: Regex for fixed width field