我需要将文件布局上的固定宽度字段与正则表达式匹配。该字段为数字/整数,始终包含四个字符,包含在0..1331范围内。当数字小于1000时,字符串用左零填充。所以这些例子都是有效的:
但以下内容必须不:
如果我只能使用正则表达式来强制执行此限制,那就太好了。演奏了一下后,我得到了表达式\0*[0-1331]\
。问题是它不会将大小限制为四个字符。当然我可以做\000[0-9]|00[10-99]|0[100-999]|[1000-1331]\
但我拒绝使用如此令人讨厌的东西。谁能想到更好的方法?
答案 0 :(得分:7)
正则表达式不是每个单个问题的答案。我的建议是做一些像:
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]$
更新
在优雅评论中,有许多形式的优雅,其中正则表达是其中之一。您还可以通过将验证抽象为单独的函数或宏来实现优雅,然后从代码中调用它:
if isValidSomethingOrOther(str) ...
其中SomethingOrOther
是具体的业务对象。这使您可以轻松地更改有效对象的想法,甚至可以根据需要使用正则表达式或您认为合适的任何其他检查(例如上面的函数)。
这使您可以满足线下的任何更改,例如这些对象现在必须是素数的要求。
我确定可以写一个“素数少于1332”的正则表达式。我同样确定我不会想要 - 我更喜欢将其编码为函数(或原始速度的查找表),特别是因为正则表达式很可能看起来像:
^2|3|5|7| ... |1327$
反正。
答案 1 :(得分:1)
这似乎太容易了,我是否正确理解了这个问题?
\[01][0-9]{3}\
我不知道是什么意思,整数范围?这必须是一种琐事或其他东西。
这似乎按照你想要的方式工作:
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]: