【问题标题】:Extracting Data with Python Regular Expressions使用 Python 正则表达式提取数据
【发布时间】:2013-04-04 05:10:17
【问题描述】:

我在围绕 Python 正则表达式想出一个正则表达式来提取特定值时遇到了一些麻烦。

我尝试解析的页面有许多 productId,它们以以下格式显示

\"productId\":\"111111\"

我需要提取所有值,在这种情况下为111111

【问题讨论】:

标签: python regex parsing


【解决方案1】:
t = "\"productId\":\"111111\""
m = re.match("\W*productId[^:]*:\D*(\d+)", t)
if m:
    print m.group(1)

表示匹配非单词字符 (\W*),然后是 productId,后跟非列字符 ([^:]*) 和 :。然后匹配非数字(\D*)并匹配并捕获后面的数字((\d+))。

输出

111111

【讨论】:

  • 这不需要是原始字符串,还是不需要转义反斜杠?
【解决方案2】:

这里的反斜杠可能会增加混乱,因为它们被(非原始)Python 字符串和正则表达式语法用作转义字符。

这会从您发布的格式中提取产品 ID:

re_prodId = re.compile(r'\\"productId\\":\\"([^"]+)\\"')

原始字符串r'...' 取消了一级反斜杠转义;使用单引号作为字符串分隔符无需转义双引号;最后,由于它们在正则表达式语言中的特殊含义,反斜杠被加倍(仅一次)。

您可以使用正则表达式对象的findall() 方法来查找某些文本中的所有匹配项:

re_prodId.findall(text_to_search)

这将返回所有产品 ID 的列表。

【讨论】:

    【解决方案3】:

    类似这样的:

    In [13]: s=r'\"productId\":\"111111\"'
    
    In [14]: print s
    \"productId\":\"111111\"
    
    In [15]: import re
    
    In [16]: re.findall(r'\d+', s)
    Out[16]: ['111111']
    

    【讨论】:

    • 我觉得这更像 Pythonic。 :)
    【解决方案4】:

    试试这个,

     :\\"(\d*)\\"
    

    如果这不能满足您的要求,请提供更多数据示例。

    【讨论】:

      猜你喜欢
      • 2017-02-28
      • 2019-05-13
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      相关资源
      最近更新 更多