好吧,对于初学者来说,您将需要一个不同的正则表达式。您拥有的将选择第一个'<'和最后一个'>'之间的所有内容所以字符串:
I can type in <b>BOLD</b>
将呈现匹配:
大胆的
解决这个问题的方法是使用惰性操作符这个网站很好地解释了为什么你应该使用
<.+?>
匹配 HTML 标签。最终,你应该替换,所以:
re.sub(r'', '', 行)
不过,我怀疑您实际上想要匹配的是标签之间的内容。在这里,一个好的前瞻可以创造奇迹!
(?<=>).+?(?=<)
看起来很疯狂,但它很容易崩溃。让我们从你所知道的开始:
.+?
匹配任意长度的字符串。? 意味着它将匹配可能的最短字符串。(我们之前添加的懒惰)
(<?=...)
是一个回顾。它从字面上看自己身后而没有捕捉到表情。
(?=...)
是前瞻。这与后视相同。然后用一点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 !