2011-03-23 173 views
0

即时试图建立一个满足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等:(

回答

2

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

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

我也用\d匹配任何数字和{2}后缀匹配任何先前传来的两个实例。如果您想在任何这些情况下匹配1或2位数字,则可以将{2}更改为{1,2}

3

*表示“零或多个前面的标记”。因此,你的正则表达式将匹配来自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() classmethod。

1

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

?匹配前一个元素的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") 
+1

抱歉,但认为不匹配111.1.111,因为它没有明确地说,在末端不多。 – RY4N 2011-03-23 08:20:13

+0

你说得对。答案已更正。 – gparis 2011-03-23 08:30:45

+0

@Ryan它不会_match_'111.1.111',因为're.match'只匹配整个字符串。然而,'re.search'仍然会返回一个匹配,我想这就是你的意思。 – 2011-03-23 10:14:42