Python中的正则表达式
目标:给定一个数字(可能很长,并且大于0),我希望在该数字的末尾去掉任何0,得到五个最没有意义的数字 我试图用regex解决这个问题,在RegexBuddy的帮助下,我找到了这个:Python中的正则表达式,python,regex,regexbuddy,Python,Regex,Regexbuddy,目标:给定一个数字(可能很长,并且大于0),我希望在该数字的末尾去掉任何0,得到五个最没有意义的数字 我试图用regex解决这个问题,在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 "
[\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
>>重新导入
>>>重新编译(r“[\d]+([\d]{0,4}+[1-9])0*”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.5/re.py”,第188行,编译中
返回编译(模式、标志)
文件“/usr/lib/python2.5/re.py”,第241行,在编译中
raise错误,v#表达式无效
sre_常量。错误:多次重复
问题是“{0,4}”后面的“+”,它似乎在python中不起作用(即使在2.6中)
如何编写工作正则表达式
附言:
我知道你可以开始除以10,然后用余数n%100000。。。但这是关于正则表达式的一个问题。
小提示。我建议您使用而不是RegExBuddy进行测试。不同的编程语言有不同的正则表达式引擎。重新测试的价值在于,它允许您在Python本身中快速测试正则表达式字符串。这样,您就可以确保使用Python的正则表达式引擎测试语法。错误似乎是一行中有两个量词,{0,4}和+。除非+在这里是一个字面意思(我怀疑,因为你说的是数字),否则我认为你根本不需要它。除非在这种情况下它的意思不同(可能是{}量词的贪婪性)?我会试试看
[\d]+([\d]{0,4}[1-9])0*
如果您实际上打算应用这两个量词,那么这可能会起作用
[\d]+(([\d]{0,4})+[1-9])0*
但是考虑到您对问题的说明,我怀疑这是您想要的。正则表达式是非常多余的。试试这个:
>>> 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
是非贪婪的,因为我相信这将提高性能和准确性。我还将其设置为“零或更多”,因为我假设这是您想要的
我还添加了锚,这样可以保证正则表达式与字符串中间的任何东西不匹配。如果这是您想要的(可能您正在扫描一个长文本?),请删除锚。
\d{0,4}+是一个所有格量词,受某些正则表达式风格(如.NET和Java)支持。Python不支持所有格量词 在RegexBuddy中,在顶部的工具栏中选择Python,RegexBuddy将告诉您Python不支持所有格量词。+将在正则表达式中以红色突出显示,并且“创建”选项卡将指示错误 如果在RegexBuddy的“使用”选项卡上选择Python,RegexBuddy将生成一个Python源代码片段,其中包含一个不带所有格量词的正则表达式,以及一条注释,指示移除所有格量词可能会产生不同的结果。下面是RegexBuddy使用问题中的正则表达式生成的Python代码:# Your regular expression could not be converted to the flavor required by this language:
# Python does not support possessive quantifiers
# Because of this, the code snippet below will not work as you intended, if at all.
reobj = re.compile(r"[\d]+([\d]{0,4}[1-9])0*")
您可能要做的是在主工具栏中选择一种风格,例如Java,然后单击Copy Regex as Python String。这将为您提供一个格式化为Pythong字符串的Java正则表达式。“复制”菜单中的项不会转换正则表达式。他们只是将其格式化为字符串。这允许您将JavaScript正则表达式格式化为Python字符串,以便您的服务器端Python脚本可以将正则表达式输入客户端JavaScript代码。这是我的解决方案
re.search(r'[1-9]\d{0,3}[1-9](?=0*(?:\b|\s|[A-Za-z]))', '02324560001230045980a').group(1)
‘4598’
-数字必须以1-9开头[1-9]
-0或3位数字\d{0,3}
-数字必须以1或9结尾[1-9]
-字符串的最后部分必须由0和或(?=0*(:?\b |\s\|[A-Za-z])
,\b
,\s
[A-Za-z]