我试图从EDGAR的公司10-K文件中提取股票代码。股票代码通常出现在一对HTML引号之间,例如“‘”或“’”。相关文本的典型部分示例:
我们的普通股已在纽约证券交易所上市(“纽约证券交易所”),代码为“ RXN”
此时我只想弄清楚如何处理各种引号中的一个或多个的出现。我可以编写一个匹配一种特定类型引号的正则表达式:
re.findall(r'under[^<]*the[^<]*symbol[^<]*“*[^<]*\n',fileText)
但是,我不能写一个寻找多种引号的正则表达式。这个正则表达式什么都不产生:
re.findall(r'under[^<]*the[^<]*symbol[^<]*“*‘*’*“*[^<]*\n',fileText)
任何帮助都将不胜感激。
答案 0 :(得分:0)
您可以使用
re.sub("&#([0-9]+);", lambda x:chr(int(x.group(1))), text)
这是有效的,因为您可以使用搜索/替换为替换部分提供可调用。 “#”后面的数字是字符的unicode点,Python chr
函数可以将其转换为文本。
例如:
re.sub("&#([0-9]+);", lambda x:chr(int(x.group(1))),
"this is a “test“")
结果
'this is a “test“'
答案 1 :(得分:0)
您的正则表达式会查找一起出现的所有引号。如果您正在寻找任何一个的可能性,您需要在每个字符串周围加上括号并or
:
(?:“)*|(?:‘)*|(?:’)*|(?:“)*
?:
使得paren组无法捕获。即,解析器不会将每个文件保存为重要文本。另外,您可能希望使用组捕获来保存股票代码 - 您实际需要的是什么。 非常快速而肮脏(且丑陋)的表达式将从给定字符串返回['NYSE', 'RXN']
:
re.findall(r'(?:(?:“)|(?:[567];)|(?:̶[01];))(.+?)(?:(?:“)|(?:[567];)|(?:̶[01];))', fileText)
您可能只希望在第一组中包含左引号,在最后一组中包含右引号。加上两者中的任何一个或两个。