Python中的正则表达式

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 "

目标:给定一个数字(可能很长,并且大于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 "<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开头
  • \d{0,3}
    -0或3位数字
  • [1-9]
    -数字必须以1或9结尾
  • (?=0*(:?\b |\s\|[A-Za-z])
    -字符串的最后部分必须由0和或
    \b
    \s
    [A-Za-z]

事实上,我认为+根本不应该存在。请尝试用\1替换。用足够长的数字在RegexBuddy上测试它,你会看到不同的地方啊,Blix的回答提到+应该是一个修饰符,以迫使{0,4}贪婪。我不记得以前见过这种语法——显然Python也没有。(在Java中,它显然使{0,4}具有“占有性”,而不是贪婪。)啊,这是真的,它迫使它比贪婪更贪婪。+告诉引擎永远不要后退,默认情况下也是如此。所以它不是很贪婪。所有格是正确的定义=)量词后面的“+”表示它是所有格。Python不支持posessivequatifiers。最终,您使用的任何正则表达式都必须在实际应用程序中对实际数据进行测试。在你的正则表达式正在构建的时候,在像RegexBuddy这样的工具中运行初始测试可以节省你的时间,只要工具使用得当(在这种情况下,在使用Python时在RegexBuddy的工具栏中选择Python)。哦,学校有一个非常旧的版本,刚刚在家下载了新版本,还有工具栏:D谢谢!我的回答适用于RegexBuddy 3.0.0及更高版本。3.0.0版于2007年6月13日发布。这是第一个可以模拟不同regex风格的版本(目前为15)。