【问题标题】:A correct python regexp returns NoneType正确的 python 正则表达式返回 NoneType
【发布时间】:2019-02-02 05:55:28
【问题描述】:

我正在尝试从文本中获取一些子字符串。

使用https://pythex.org/ 来检查我的正则表达式

pythex.org 显示我的正则表达式一切正常,但是当我尝试在我的代码中使用它时,第二个正则表达式不起作用并且 re 返回

AttributeError: 'NoneType' 对象没有属性 'group'

我想打印 uri 变量。仅返回时间戳。代码示例:

import re
line = "2019-01-30 01:05:26.255595500 tracker uri='/tracker_log/?f=__lxGc__&step=1&ses_id=2yz65vcsg0k8zk1952295510&id=123123&type=ad&rt=952301228' referer='https://instagram.com' ua='Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0'"

timestamp = re.match("\d+-\d+-\d+.\d+:.\d+:.\d+.\d+", line)
if timestamp:
    print(timestamp.group(0))
uri = re.match("(?<=uri=\').+(?=\' ref)", line)
if uri:
    print(uri.group(0))

任何帮助将不胜感激!

【问题讨论】:

  • I can't reproduce your problem,你的代码对我有用。
  • @TimBiegeleisen OP 期望输出 2 件事(日期时间和 uri),而不是 1。如果您将 re.match 更改为 re.search,正如 @benvc 正确建议的那样,那么 OP 的问题是已解决。
  • 你可以完全避免使用正则表达式,正如俗话所说:有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有了两个问题。 例如,uri_str = next(filter( lambda str : str.startswith('uri'), line.split(' ') ))

标签: python regex python-3.x


【解决方案1】:

re.match 仅在字符串的开头与正则表达式匹配时才返回匹配对象,这就是您成功匹配字符串开头的时间戳但不匹配 uri 字符串的原因。

改用re.search 为字符串中正则表达式匹配的第一个位置返回一个匹配对象。

例如:

import re

line = "2019-01-30 01:05:26.255595500 tracker uri='/tracker_log/?f=__lxGc__&step=1&ses_id=2yz65vcsg0k8zk1952295510&id=123123&type=ad&rt=952301228' referer='https://instagram.com' ua='Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0'"

uri = re.search(r"(?<=uri=\').+(?=\' ref)", line)

print(uri.group(0))
# OUTPUT
# /tracker_log/?f=__lxGc__&step=1&ses_id=2yz65vcsg0k8zk1952295510&id=123123&type=ad&rt=952301228

【讨论】:

    猜你喜欢
    • 2018-04-15
    • 2019-12-08
    • 2011-09-28
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多