删除字符串中除第一次出现以外的所有出现
问题内容:
在Python中,我希望<html>
从字符串中删除所有“ ”(第一次出现时除外)。
另外,我正在寻找</html>
从字符串中删除所有“ ”(最后一次出现的除外)。
<html>
可以是大写,因此我需要不区分大小写。
我最好的方法是什么?
问题答案:
此解决方案使用两个正则表达式。第一个正则表达式将整个文件/字符串分成三个块:
- 第一个块(捕获到group中
$1
)是从字符串开始到第一个HTML开始标记(包括该标记)的所有内容。 - 第二个块(捕获到group中
$2
)是第一个HTML开始标记之后到最后一个HTML关闭标记开始之间的所有内容。 - 第三个块(捕获到group中
$3
)包括最后一个HTML结束标记以及文件/字符串末尾的所有内容。
该函数首先尝试将正则表达式与输入文本匹配。如果匹配,则使用第二个正则表达式从最外面的HTML元素(先前在组2中捕获)的内容中删除所有HTML起始和结束标签。然后使用三个大块重新组装字符串(中间大块已去除HTML标签)。
def stripInnermostHTMLtags(text):
'''Strip all but outermost HTML start and end tags.
'''
# Regex to match outermost HTML element and its contents.
p_outer = re.compile(r"""
^ # Anchor to start of string.
(.*?<html[^>]*>) # $1: Outer HTML start tag.
(.*) # $2: Outer HTML element contents.
(</html\s*>.*) # $3: Outer HTML end tag.
$ # Anchor to end of string.
""", re.DOTALL | re.VERBOSE | re.IGNORECASE)
# Split text into outermost HTML tags and its contents.
m = p_outer.match(text)
if m:
# Regex to match HTML element start or end tag.
p_inner = re.compile("</?html[^>]*>", re.IGNORECASE)
# Strip contents of any/all HTML start and end tags.
contents = p_inner.sub("", m.group(2))
# Put string back together stripped of inner HTML tags.
text = m.group(1) + contents + m.group(3)
return text
请注意,此解决方案可以正确处理HTML开始标记中的所有属性。还要注意,此解决方案不处理具有属性值包含>
字符值的HTML标记(但这应该非常少见)。