我需要找到.txt格式的所有标签(SEC备案)并从备案中删除。
嗯,作为Python的初学者,我使用以下代码查找标签,但它返回None,None,...我不知道如何删除所有标签。我的问题是如何找到所有标签< ....>并删除所有标记,以便文档包含除标记之外的所有内容。
import re
tags = [re.search(r'<.+>', line) for line in mylist]
#mylist is the filename opened by open(filename, 'rU').readlines()
感谢您的时间。
答案 0 :(得分:0)
re.sub(r'<.*?>', '', line)
使用re.sub
和<.*?>
表达式
答案 1 :(得分:0)
使用类似的东西:
re.sub(r'<[^>]+>', '', open(filename, 'r').read())
您当前的代码为不包含角度括号标记的每一行获得None
。
您可能希望使用[^>]
来确保它只与第一个&gt;匹配。
答案 2 :(得分:0)
嗯,对于初学者来说,你需要一个不同的正则表达式。你拥有的那个将选择第一个'&lt;'之间的所有内容和最后一个'&gt;'所以字符串:
I can type in <b>BOLD</b>
将呈现匹配:
粗体
解决这个问题的方法是使用懒惰的操作符this site对你应该使用的原因有一个很好的解释
&LT; + GT?;
匹配HTML标记。最后,你应该代替,所以:
re.sub(r'','',line)
尽管如此,我怀疑你真正想要匹配的是标签之间的匹配。这是一个好的前瞻可以创造奇迹的地方!
(小于?=&GT)。+?(= LT;?)
看起来很疯狂,但它很简单。让我们从你所知道的开始:
.+?
匹配任意长度的字符串。 ?意味着它将匹配可能的最短字符串。 (我们之前添加的懒惰)
(<?=...)
是一个外观。它实际上看起来并没有捕捉到表达。
(?=...)
是一个先行者。它与外观相同。然后带一点findall:
re.findall(r'(?<=>).+?(?=<)', line);
现在,你可以遍历数组并修剪掉一些不必要的空间并留下一些非常好的输出!或者,如果您真的想使用替换方法(我知道我愿意):
re.sub(r'\s*(?:</+?>\s*)+', ' ', line)
的
\s*
将匹配附加到标签的任何数量的空白,然后可以用一个空格替换,将那些令人不安的双重和三重空间缩小,这通常是由于过度仔细标记造成的。作为奖励,
(?: ... )
被称为非捕获组(它不会在您的结果中为您提供较小的子匹配)。在这种情况下,为了您的目的,这并不是必需的,但是群体总是有用的事情要考虑,而且只捕捉您需要的东西是一种好习惯。将+添加到其末尾(正如我所做的那样)将捕获尽可能多的标记,将它们排在一个空格中。所以如果文件有
This is <b> <i> overemphasized </b> </i>!
你会得到
This is overemphasized !
而不是
This is overemphasized !