繁体   English   中英

从大字符串中提取时间戳

[英]Extract timestamp from large string

我有一个像这样的大字符串:

SEND OK HTTP/1.1 200 OK 
Access-Control-Allow- l-Allow-Methods: GET,POST,DELETE
Access-Control-Allow-Headers: X-Requested-With,
Phant-Private-Key Content-Type: text/plain X-Rate-Limit-Limit: 300
X-Rate-Limit-Remaining: 297
X-Rate-Limit-Reset: 1452931335.777
Date: Sat, 16 Jan 2016 07:50:17 GMT 
Set-Cookie: SERVERID=; Expires=Thu, 01-Jan-197 0 00:00:01 GMT; path=/ Cache-control: private
Transfer-Encoding: chunked

它包含类似Sat, 16 Jan 2016 07:50:17 GMT这样的字符串。该字符串可以是任何时间。 我想从整体上考虑这个字符串。 我知道这是一个非常基本的问题,但是如何在python中做到这一点。

字符串并不总是包含子字符串,例如Date: :。

采用

import re
datepattern = re.compile("\w{3}, \d{2} \w{3} \d{4} \d{2}:\d{2}:\d{2} \w{3}")
matcher = datepattern.search(string_to_match_against)
print(matcher.group(0))

以你的例子

string_to_match_against = """
SEND OK HTTP/1.1 200 OK 
Access-Control-Allow- l-Allow-Methods: GET,POST,DELETE
Access-Control-Allow-Headers: X-Requested-With,
Phant-Private-Key Content-Type: text/plain X-Rate-Limit-Limit: 300
X-Rate-Limit-Remaining: 297
X-Rate-Limit-Reset: 1452931335.777
Date: Sat, 16 Jan 2016 07:50:17 GMT 
Set-Cookie: SERVERID=; Expires=Thu, 01-Jan-197 0 00:00:01 GMT; path=/ Cache-control: private
Transfer-Encoding: chunked
"""

我们会打印

Sat, 16 Jan 2016 07:50:17 GMT

似乎您正在尝试匹配http标头,并且(根据“ HTTP:Pocket Reference”,O'Reilly,2000年),Date标头可能有三种日期格式:

  1. RFC 1123(星期一,1996年5月6日04:57:00 GMT)-这是您的示例
  2. RFC 1036(星期一,96年5月6日04:57:00 GMT)
  3. ANSI C asctime()(1996年5月6日星期一04:57:00)

建议使用RFC1123,但是如果我们希望匹配这三种可能性中的任何一种,我们需要设计一个正则表达式,可以在这三种可能性之间进行选择

import re
pat1123 = "\w{3}, \d{2} \w{3} \d{4} \d{2}:\d{2}:\d{2} \w{3}"
pat1036 = "\w+?, \d{2}-\w{3}-\d{2} \d{2}:\d{2}:\d{2} \w{3}"
patc = "\w{3} \w{3} \d+? \d{2}:\d{2}:\d{2} \d{4}"
datepattern = re.compile("(?:%s)|(?:%s)|(?:%s)"%(pat1123,pat1036,patc))
matcher = datepattern.search(string_to_match_against)
print(matcher.group(0))

请注意,此方法不依赖于存在的任何内容(提取日期除外)(我们不需要Date:文本)。 如果出现多个这样的日期,它将找到第一个。 如果需要多个,请使用datepattern.findall

使用您提供的样本,您可以像这样进行处理;

import re

s = """
> SEND OK HTTP/1.1 200 OK 
> Access-Control-Allow- l-Allow-Methods: GET,POST,DELETE
> Access-Control-Allow-Headers: X-Requested-With,
> Phant-Private-Key Content-Type: text/plain X-Rate-Limit-Limit: 300
> X-Rate-Limit-Remaining: 297
> X-Rate-Limit-Reset: 1452931335.777
> Date: Sat, 16 Jan 2016 07:50:17 GMT 
> Set-Cookie: SERVERID=; Expires=Thu, 01-Jan-197 0 00:00:01 GMT; path=/ Cache-control: private
> Transfer-Encoding: chunked
"""

pat = re.compile(r'Date:([\s\w,:]+)')

print pat.search(s).group(1).strip()

输出:

'Sat, 16 Jan 2016 07:50:17 GMT'

使用请求模块

import requests

r = requests.get('http://www.google.com')
if r.status_code == 200:
    print(r.headers['date'])

如果每个设置/属性(例如X-Rate-Limit-ResetDate等)始终出现在字符串中并且始终以相同的顺序出现,则可以split()多次:

>>> mystring.split('Date: ')[1].split('>')[0].strip()
'Sat, 16 Jan 2016 07:50:17 GMT'

如果不是,则可以创建一个简单的正则表达式来查找特定行:

>>> re.search(r'Date:\s*(.*?)\s*>', mystring).group(1)
'Sat, 16 Jan 2016 07:50:17 GMT'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM