代码之家  ›  专栏  ›  技术社区  ›  Andrea Ambu

Python中的正则表达式

  •  1
  • Andrea Ambu  · 技术社区  · 16 年前

    目标:给定一个数字(可能很长,并且大于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
    

    问题是“{0,4}”后面的“+”,它似乎在python中不起作用(即使在2.6中)

    如何编写工作正则表达式?

    我知道你可以开始除以10,然后用余数n%100000。。。但这是关于正则表达式的一个问题。

    5 回复  |  直到 16 年前
        1
  •  10
  •   Blixt    16 年前

    那个正则表达式是非常多余的。试试这个:

    >>> import re
    >>> re.compile(r"(\d{0,4}[1-9])0*$")
    

    012345 如果确实需要验证不存在非数字字符,则可以使用以下方法:

    >>> import re
    >>> re.compile(r"^\d*?(\d{0,4}[1-9])0*$")
    

    不管怎样,这个 \d 不需要在字符类中,并且是量词 {0,4} 不需要被强迫贪婪(因为 + 指定,尽管Python显然无法识别。)

    \d 是非贪婪的,因为我相信这将提高性能和准确性。我还将其设置为“零或更多”,因为我假设这是您想要的。

    我还添加了锚,这样可以确保正则表达式与字符串中间的任何东西不匹配。如果这是您想要的(也许您正在扫描一个长文本?),请删除锚定。

        2
  •  5
  •   Jan Goyvaerts    16 年前

    \d{0,4}+是一个所有格量词,受某些正则表达式风格(如.NET和Java)支持。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代码。

        3
  •  2
  •   Jay Atkinson    16 年前

    reTest 而不是RegExBuddy。不同的编程语言有不同的正则表达式引擎。重新测试的价值在于,它允许您在Python本身中快速测试正则表达式字符串。这样,您可以确保使用Python的正则表达式引擎测试语法。

        4
  •  0
  •   Sean    16 年前

    错误似乎是一行中有两个量词,{0,4}和+。除非+在这里是一个字面意思(我怀疑,因为你说的是数字),否则我认为你根本不需要它。除非在这种情况下它的意思不同(可能是{}量词的贪婪性)?我会试试看

    [\d]+([\d]{0,4}[1-9])0*
    

    如果您实际上打算应用这两个量词,那么这可能会起作用

    [\d]+(([\d]{0,4})+[1-9])0*
    

        5
  •  0
  •   memowe    12 年前

    这是我的解决方案。

    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]