【问题标题】:Python Regular Expression Match All 5 Digit Numbers but None LargerPython 正则表达式匹配所有 5 位数字但没有更大的数字
【发布时间】:2011-04-01 18:27:18
【问题描述】:

我正在尝试对遍布整个 HTML 网页的 5 位数优惠券代码进行字符串匹配。例如,532322103240021 等...我可以使用[0-9]{5} 处理任何 5 位数字字符串的简单情况,尽管这也匹配 6、7、8...n 位数字.有人可以建议我如何修改这个正则表达式以匹配 5 位数字吗?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    无需为特殊情况的开头和结尾填充字符串,如John La Rooy 答案中的答案,可以使用否定的前瞻和后瞻来使用单个正则表达式处理这两种情况

    >>> import re
    >>> s = "88888 999999 3333 aaa 12345 hfsjkq 98765"
    >>> re.findall(r"(?<!\d)\d{5}(?!\d)", s)
    ['88888', '12345', '98765']
    

    【讨论】:

    • 你的答案是正确的,被选为解决方案的那个不是
    【解决方案2】:

    注意:使用\D 存在问题,因为\D 匹配任何不是数字的字符,而是使用\b\b 在这里很重要,因为它与单词边界匹配,但仅在单词的结尾或开头。

    import re  
    
    input = "four digits 1234 five digits 56789 six digits 01234,56789,01234"
    
    
    re.findall(r"\b\d{5}\b", input)  
    
    result : ['56789', '01234', '56789', '01234']
    

    但如果有人使用 re.findall(r"\D(\d{5})\D", s) 输出:['56789','01234'] \D 无法处理逗号或任何连续输入的数字。

    \b 在这里很重要,它匹配空字符串,但仅在单词的结尾或开头。

    更多文档:https://docs.python.org/2/library/re.html

    更多关于 \D\b 用法的说明

    This example 使用\D,但它没有捕获所有五位数字。

    This example 使用\b 同时捕获所有五位数字。

    干杯

    【讨论】:

    • 我将您的正则表达式更改为在那里使用原始字符串,因为 \b 否则是字符串中的有效转义字符。这个答案的问题在于,如果其他字母字符加入到数字字符串中,它就不起作用。 “56789a”
    • @gnibbler \D 也不能处理它!
    • 您的意思是\D 不处理字符串的开头或结尾?我在回答中处理了这个问题。
    • @gnibbler 我的意思是它不能处理“56789a”
    • “56789a”使用\D匹配为“56789”
    【解决方案3】:

    完整字符串:^[0-9]{5}$

    在字符串中:[^0-9][0-9]{5}[^0-9]

    【讨论】:

    • 谢谢,实际上,与解决方案 '\b\d{5}\b' 和 '^[0-9]{5}$' 混淆了,谢谢指出,后一个将表达式创建为字符串,这就是我所需要的。
    • 这个答案在字符串的开头和开头不起作用。例如它不匹配“12345”
    • @Crayon Violent [^0-9][0-9]{5}[^0-9] --> 你能解释一下这个正则表达式吗?
    • @DhiwakarRavikumar [^0-9] 任意 1 个非数字字符,后跟 [0-9]{5} 正好 5 位数字,后跟 [^0-9] 任意 1 个非数字字符
    【解决方案4】:

    你可以试试

    \D\d{5}\D
    

    或许

    \b\d{5}\b
    

    我不确定 python 如何处理行尾和空格。

    我相信^\d{5}$ 不适合您,因为您可能希望获得其他文本中某处的数字。

    【讨论】:

    • 第一个正则表达式不适用于“12345”,第二个正则表达式不适用于“12345a”
    【解决方案5】:
    >>> import re
    >>> s="four digits 1234 five digits 56789 six digits 012345"
    >>> re.findall(r"\D(\d{5})\D", s)
    ['56789']
    

    如果它们可以出现在开头或结尾,则填充字符串比弄乱特殊情况更容易

    >>> re.findall(r"\D(\d{5})\D", " "+s+" ")
    

    【讨论】:

    • 我在回答中强调了正则表达式中 \D 和 \b 之间的区别。
    • re.findall(r"\D(\d{5})\D","15/05/2018 a8711 43160") 给出[ ]。什么给了?
    • @Aetos。它在答案中说您需要填充此输入字符串。向前看和向后看会大大降低正则表达式的性能。如果你能报告你的发现,我会很感兴趣。
    【解决方案6】:

    您可能希望在 5 位数字字符串之前和之后匹配一个非数字,例如 [^0-9]([0-9]{5})[^0-9]。然后您可以捕获内部组(您想要的实际字符串)。

    【讨论】:

    • 不能用“12345”作为字符串的开头和字符串的结尾不匹配[^0-9]
    【解决方案7】:

    一种非常简单的方法是匹配所有数字组,例如r'\d+',然后在处理结果时跳过每个不超过五个字符的匹配项。

    【讨论】:

      猜你喜欢
      • 2014-03-22
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 2012-04-16
      相关资源
      最近更新 更多