【问题标题】:How can I get my RegEx to capture text on both sides of a colon?如何让我的 RegEx 捕获冒号两侧的文本?
【发布时间】:2011-11-03 03:37:46
【问题描述】:

我正在尝试解析文件中的一些输入文本,这些文本最初是从 Twitter API 中获取的。该文件是纯文本,在这种情况下我实际上并没有获取 JSON。这是输入文本的 sn-p:

.....HootSuite</a>", "text": "For independent news reports on the crisis in #Japan, 
see @DemocracyNow News Archive: http://ow.ly/4ht9Q
#nuclear #Fukushima #rdran #japon", "created_at": "Sat Mar 19.....

基本上我需要抓住这个:

"text": "For independent news reports "on" the crisis in #Japan, see @DemocracyNow 
News Archive: http://ow.ly/4ht9Q #nuclear #Fukushima #rdran #japon"

这是我试图开始工作的两个,但我遇到了一些问题:

    re.findall('"text":[^_]*',line)
    re.findall('"text":[^:}]+',line)

第一个可以让我在我想要的部分之后抓取所有内容,直到“创建”。第二个也可以,但是当文本包含“:”时,它直到信息结束才会出现

有人对 RegEx 有一些经验,可以为我指明正确的方向吗?

【问题讨论】:

  • 如果您从 Twitter API 获取它,我们可以假设您获取的是 JSON 吗?为什么不直接提取 JSON 值? pypi.python.org/pypi/simplejson
  • 这不是一个坏主意,好点。这是一整行数据(尽我所能粘贴) {"favorited": false, "truncated": false, "source": "web", "text": "West Ham 回击马刺队。托特纳姆热刺主场失利将是重返冠军联赛的严重挫折。", "created_at": "Sat Mar 19 14:19:19 +0000 2011", "retweeted": false,, "class": "政治”,“实体”:,“in_reply_to_status_id_str”:空,“id_str”:“49112718128594945”,“in_reply_to_screen_name”:空,“用户”:{“follow_request_sent”:空,“profile_use_background_image”:真,“id”:21619519 , }

标签: python regex parsing findall


【解决方案1】:

如果您使用的是 Twitter API,我想它会将 JSON 返回给您。 JSON 支持任意嵌套,正则表达式永远无法在每种情况下都正确解析它。使用 JSON 解析器会更好。由于 YAML 是 JSON 的超集,因此您也可以使用 YAML 解析器。我会看看PyYaml。 (这是我所知道的。他们可能也只是 JSON 解析器)

那么解析就很简单了:

import yaml
results = yaml.load(twitter_response)
print results["text"]  # This would contain the string you're interested in.

【讨论】:

    【解决方案2】:

    【讨论】:

    • 不幸的是,我没有直接使用 twitter API。信息是从给定的输入文件中获取的,该文件只是文本格式,所以 simplejason 在这种特殊情况下对我没有帮助
    • 它仍然会帮助你。只需使用文本文件作为输入。 simplejson 是一个 JSON 解析器。输入的文本文件不管是不是直接从推特上抓取的都是JSON数据。
    【解决方案3】:

    Json 是一种足够简单的格式,如果您尝试做一些琐碎的事情,您并不总是需要解析器。考虑示例行:

    >>> line = """{ "text" : "blah blah foo", "other" : "blah blah bar" }"""
    

    这里有两种方法可以做你想做的事。

    使用正则表达式:

    >>> import re
    >>> m = re.search('"text"\ *:\ *"([^"]*)',line)
    >>> m.group()
    '"text" : "blah blah bar'
    >>> m.group(1)
    'blah blah bar'
    

    使用eval(json是一种非常pythonic的格式):

    >>> d = eval(line)
    >>> d['text']
    'blah blah bar'
    

    【讨论】:

      猜你喜欢
      • 2017-11-30
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2016-06-03
      • 2013-04-25
      • 2011-05-19
      • 1970-01-01
      • 2019-05-29
      相关资源
      最近更新 更多