【问题标题】:Python regular expression to pull text inside of HTML quotation marksPython正则表达式提取HTML引号内的文本
【发布时间】:2015-05-24 15:26:10
【问题描述】:

我正在尝试从公司在 EDGAR 上的 10-K 文件中提取股票代码。股票代码通常出现在一对 HTML 引号之间,例如“‘”或“’”。相关文本的典型部分示例:

我们的普通股已在纽约证券交易所 (“NYSE”) 上市,代码为 “RXN”

此时我只是想弄清楚如何处理一个或多个引号的出现。我可以编写一个匹配一种特定类型引号的正则表达式:

re.findall(r'under[^<]*the[^<]*symbol[^<]*&ldquo;*[^<]*\n',fileText)

但是,我无法编写查找不止一种引号的正则表达式。这个正则表达式什么也没产生:

re.findall(r'under[^<]*the[^<]*symbol[^<]*&ldquo;*&#145;*&#146;*&#147;*[^<]*\n',fileText)

任何帮助将不胜感激。

【问题讨论】:

  • 使用 html 解析器
  • (["'])((?:(?=(?:(\\))*)\3.|&amp;#\d{3};)*?)\1?
  • @PadraicCunningham 你能详细说明为什么这样做更可取吗?

标签: python regex quotes


【解决方案1】:

您的正则表达式会查找 所有 一起出现的引号。如果您正在寻找任何一个的可能性,您需要在每个字符串周围加上括号并or他们:

(?:&ldquo;)*|(?:&#145;)*|(?:&#146;)*|(?:&#147;)*

?: 使括号组不被捕获。即,解析器不会将每一个都保存为重要文本。顺便说一句,您可能希望使用组捕获来保存股票代码——您实际要查找的内容。 非常快速而肮脏(丑陋)的表达式,将从给定字符串返回['NYSE', 'RXN']

re.findall(r'(?:(?:&ldquo;)|(?:&#14[567];)|(?:&#822[01];))(.+?)(?:(?:&ldquo;)|(?:&#14[567];)|(?:&#822[01];))', fileText)

您可能只想在第一组中包含左引号,在最后一组中包含右引号。加上非此即彼的引号。

【讨论】:

    【解决方案2】:

    你可以使用

    re.sub("&#([0-9]+);", lambda x:chr(int(x.group(1))), text)
    

    这是可行的,因为您可以使用搜索/替换为替换部分提供可调用的内容。 “#”后面的数字是字符的unicode点,Pythonchr函数可以将其转换为文本。

    例如:

    re.sub("&#([0-9]+);", lambda x:chr(int(x.group(1))),
           "this is a &#8220;test&#8220;")
    

    结果

    'this is a “test“'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      相关资源
      最近更新 更多