Python 将文本拉入 HTML 引号内的正则表达式

Python regular expression to pull text inside of HTML quotation marks

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

Our common stock has been listed on the New York Stock Exchange (“NYSE”) under the symbol “RXN”

在这一点上,我只是想弄清楚如何处理各种引号中的一个或多个的出现。我可以编写一个正则表达式来匹配一种特定类型的引号:

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

但是,我无法编写查找不止一种引号的正则表达式。此正则表达式不产生任何结果:

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

如有任何帮助,我们将不胜感激。

您可以使用

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

这是有效的,因为您可以使用 search/replace 为替换部分提供可调用。 “#”后面的数字是字符的unicode点,Python chr函数可以将其转换为文本。

例如:

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

结果

'this is a “test“'

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

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

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

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

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