【发布时间】: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 等:(
【问题讨论】:
我正在尝试创建一个匹配 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 等:(
【问题讨论】:
* 表示“零个或多个前面的令牌”。因此,您的正则表达式将匹配从 1.1.1 到 999999.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() 类方法。
【讨论】:
您可以使用\b 来匹配单词边界。例如,您可以制作正则表达式:
re.compile(r'\b\d{2}\.\d{2}\.\d{2}\b')
我还使用\d 来匹配任何数字,并使用{2} 后缀来匹配之前出现的两个实例。如果您想在任何一种情况下匹配 1 位或 2 位数字,您可以将 {2} 更改为 {1,2}。
【讨论】:
尝试使用? 而不是* 作为通配符。
? 匹配前一个元素的 0 或 1 个实例。换句话说,它使元素成为可选的;它可以存在,但不必存在。
这将匹配1.1.1 和11.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,因为re.match 只匹配整个字符串。但是,re.search 仍然会返回匹配项,我猜这就是您的意思。