Python regex lookbehind断言

时间:2016-05-02 20:15:53

标签: python regex

我想存储24小时格式的时间,这是一个字符串的一部分,如:

184.107.21.129 - - [03/Feb/2013:02:33:44]

我的代码是

times = re.findall(r'\d{2}:\d{2}:\d{2}(?<='+arg+r' - - \[\d{2}/[JFMASOND][aepuco][nbrynlgptvc]/\d{4}:)', new_file.read())

其中arg是字符串“184.107.21.129”。 new_file已成功读取。 问题是在尝试打印时列表时间为空,表明我的正则表达式是错误的。 在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

你必须明白一个lookbehind(或任何其他断言)适用于字符串中的位置而你的位置是在时间部分之后。由于你的lookbehind不包含时间部分,它将无法工作。

换句话说,你可以写:

r'\d{2}:\d{2}:\d{2}(?<='+arg+r' - - \[\d{2}/[JFMASOND][aepuco][brynlgptvc]/\d{4}:\d{2}:\d{2}:\d{2})'

r'(?<='+arg+r' - - \[\d{2}/[JFMASOND][aepuco][bcglnprtvy]/\d{4}:)\d{2}:\d{2}:\d{2}'

但请注意,如果您只想使用re.findall方法提取某些内容,则可以使用捕获组轻松完成此操作,而无需外观:

arg+r' - - \[\d{2}/[JFMASOND][aepuco][bcglnprtvy]/\d{4}:(\d{2}:\d{2}:\d{2})'