【问题标题】:Regular expression help for a date (python+日期的正则表达式帮助(python
【发布时间】:2011-03-23 08:04:48
【问题描述】:

我正在尝试创建一个匹配 11.11.11 但不匹配 111.11.111 的表达式 我正在使用 python

keyword = re.compile(r"[0-9]*[0-9]\.[0-9]*[0-9]\.[0-9]*[0-9]")

日期可以在句子的开头/结尾,并且没有空格,而是在之前/之后的下一行。我将如何解释这两者?因为它会拿起 11.11.11 和 111.11.11111 等:(

【问题讨论】:

    标签: python regex


    【解决方案1】:

    * 表示“零个或多个前面的令牌”。因此,您的正则表达式将匹配从 1.1.1999999.999999.99999 等的任何内容。

    你可以像这样更具体:

    keyword = re.compile(r"\b[0-9]{2}\.[0-9]{2}\.[0-9]{2}\b")
    

    \b 单词边界锚确保数字在该位置开始/结束。否则,您可以选择子字符串匹配项(例如,匹配字符串 1234.56.7890 中的 34.56.78)。

    当然,您需要单独验证它是否真的是一个合理的日期。不要为此使用正则表达式(它是possible but cumbersome),而是使用datetime 模块的strptime() 类方法。

    【讨论】:

      【解决方案2】:

      您可以使用\b 来匹配单词边界。例如,您可以制作正则表达式:

       re.compile(r'\b\d{2}\.\d{2}\.\d{2}\b')
      

      我还使用\d 来匹配任何数字,并使用{2} 后缀来匹配之前出现的两个实例。如果您想在任何一种情况下匹配 1 位或 2 位数字,您可以将 {2} 更改为 {1,2}

      【讨论】:

        【解决方案3】:

        尝试使用? 而不是* 作为通配符。

        ? 匹配前一个元素的 0 或 1 个实例。换句话说,它使元素成为可选的;它可以存在,但不必存在。

        这将匹配1.1.111.11.11,但不匹配1111.1111.1111

        keyword = re.compile(r"\b[0-9]?[0-9]\.[0-9]?[0-9]\.[0-9]?[0-9]\b")
        

        【讨论】:

        • 很抱歉,但这确实与 111.1.111 匹配,因为它没有明确地在结尾说不多。
        • @Ryan 不会匹配 111.1.111,因为re.match 只匹配整个字符串。但是,re.search 仍然会返回匹配项,我猜这就是您的意思。
        猜你喜欢
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 2018-11-05
        • 2023-03-26
        • 2021-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多