Python 从大字符串中提取时间戳

Python 从大字符串中提取时间戳,python,regex,Python,Regex,我有一根像这样的大绳子: 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-R

我有一根像这样的大绳子:

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,2016年1月16日07:50:17 GMT
字符串可以是任何时间的。我想把这根绳子整根都拔出来。我知道这是一个非常基本的问题,但如何用python实现呢

并非总是字符串包含子字符串,如
日期:

如果每个设置/属性(例如
X-Rate-Limit-Reset
日期
等)总是出现在字符串中,并且总是以相同的顺序出现,您可以将其拆分几次:

>>> 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'

使用您提供的示例,您可以这样处理

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'
使用模块

使用

以你为例

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头,并且(根据O'Reilly,2000年的“http:Pocket Reference”)日期头可能有三种格式:

  • RFC1123(1996年5月6日星期一04:57:00 GMT)-这是您示例中的一个
  • RFC1036(1996年5月6日星期一04:57:00 GMT)
  • 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))
    

    请注意,这种方法不依赖于除要提取的日期之外的任何内容(我们不需要日期:文本)。如果发生了多个这样的日期,它会找到第一个。使用
    datepattern.findall
    如果需要不止一个。每个设置/属性(例如
    X-Rate-Limit-Reset
    Date
    等)是否总是存在,总是以相同的顺序出现?在您做出两个实质性更改使现有答案无效之前,我已将您的问题回滚到其原始形式。如果你愿意,可以随意接受回答这个问题的答案。如果你有一个本质上不同的问题,那么就为它创建一个新的问题。这个问题很混乱。
    01-Jan-197 0
    中的空格是否应该存在?现在还不清楚您是在问如何查找和解析HTTP请求头中的所有日期(在这种情况下,您应该问这个问题)还是其他问题。假设您的帖子中的所有错误都没有出现在实际数据中,您是否考虑过使用HTTP头解析器而不是regex?如果“日期:“以前总是存在。如果不是呢?哦,有可能键完全不存在?实际日期字符串的格式如何?它是否总是以一周中缩短的一天开始?@user3563059-它是否总是在自己的线路上?其他字段是否保证不包含任何看起来像日期字符串的文本?出于历史原因,我将把这个答案留在这里,因为它完美地回答了原始问题(OP在得到答案后更改了原始问题,而不是因为这个原因而建议问一个新问题),这可能对某些用户有用。如果“Date:”不以字符串形式出现怎么办?@user3563059虽然键应该出现在标题中,但日期格式是否统一?我已将您的编辑回滚到您回答原始问题的答案的原始状态(我已回滚到其原始状态),就像我自己的一样。ok。但是我认为OP对问题的第二次编辑是正确的。我注意到了。但由于OP没有接受任何答案,所以它不会使任何被接受的答案无效。答案可以根据我想的问题修改。真的吗?我认为这是一个文件或只是一些字符串。因此,在这种情况下不能使用
    请求。还有OP说:字符串并不总是包含像
    Date:
    @Kevin这样的子字符串,我想这是一个请求OP说“我有一个像这样的大字符串”,所以你不能假设它是一个请求。你必须利用OP提供的信息。所以在这种情况下,它是一个字符串而不是一个请求。@Thaille,它的字符串是一个请求的结果,我认为OP使用了一个糟糕的设计,这应该重新检查它的设计。我通过SIM900A在请求时获得这些头。据我所知,我不认为我可以使用SIM900A只获得日期标题。
    Sat, 16 Jan 2016 07:50:17 GMT
    
    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))