我需要与正则表达式上的文件布局匹配的固定宽度字段。 该字段是数字/整数,总是有四个字符和被包括在0..1331的范围内。 当数量小于1000,串充满了左零。 因此,所有这些例子是有效的:
- 0000
- 0001
- 0010
- 1000年
- 1331
但必须按下列不接受:
这将是很好,如果我能强制执行此限制只用正则表达式。 打了一下后,我得到表达\0*[0-1331]\
。 问题是,它没有大小限制为四个字符。 当然,我可以做\000[0-9]|00[10-99]|0[100-999]|[1000-1331]\
但我拒绝使用东西这么讨厌。 谁能想到一个更好的办法?
正则表达式是不回答每一个问题。 我的建议是做一些事情,如:
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$
无论如何。
这似乎太容易了,我在正确认识这个问题?
\[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]: