目标:给定一个数字(它可能很长并且大于 0),我希望得到在该数字末尾去掉任何 0 的五个最不有意义的数字。
我试图用正则表达式解决这个问题,在 RegexBuddy 的帮助下我找到了这个:
[\d]+([\d]{0,4}+[1-9])0*
但是 python 无法编译它。
>>> import re
>>> re.compile(r"[\d]+([\d]{0,4}+[1-9])0*")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/re.py", line 188, in compile
return _compile(pattern, flags)
File "/usr/lib/python2.5/re.py", line 241, in _compile
raise error, v # invalid expression
sre_constants.error: multiple repeat
问题是“{0,4}”之后的“+”,似乎它在 python 中不起作用(即使在 2.6 中也是如此)
如何编写一个有效的正则表达式?
附言: 我知道您可以开始除以 10,然后使用余数 n%100000...但这是关于正则表达式的问题。
请您参考如下方法:
那个正则表达式非常多余。试试这个:
>>> import re
>>> re.compile(r"(\d{0,4}[1-9])0*$")
上面的正则表达式假设数字是有效的(例如,它也会匹配“abc0123450”)。如果你真的需要验证没有非数字字符,你可以使用这个:
>>> import re
>>> re.compile(r"^\d*?(\d{0,4}[1-9])0*$")
反正\d不需要在字符类中,量词{0,4}也不需要强制贪心(正如附加的 + 指定的那样,尽管显然 Python 不识别它。)
此外,在第二个正则表达式中,\d 是非贪婪的,因为我相信这会提高性能和准确性。我还把它设为“零或更多”,因为我认为这就是您想要的。
我还添加了 anchor ,因为这可以确保您的正则表达式不会匹配字符串中间的任何内容。如果这是您想要的(也许您正在扫描长文本?),请移除 anchor 。
