Python:除了第一次出现之外删除字符串中的所有出现(不区分大小写)

时间:2011-12-18 15:04:52

标签: python regex

在Python中,我希望从字符串中删除所有“<html>”(第一次出现除外)。

另外,我想从字符串中删除所有“</html>”(最后一次出现除外)。

<html>可以是大写的,所以我需要它不区分大小写。

我最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

要删除字符串<html>中第一次出现的s以外的所有内容,您可以使用以下代码:

substr = "<html>"
try:
    first_occurrence = s.index(substr) + len(substr)
except ValueError:
    pass
else:
    s = s[:first_occurrence] + s[first_occurrence:].replace(substr, "")

除了</html>的最后一次出现之外的所有内容都可以通过类似的方式删除:

substr = "</html>"
try:
    last_occurrence = s.rindex(substr)
except ValueError:
    pass
else:
    s = s[:last_occurrence].replace(substr, "") + s[last_occurrence:]

您可能希望用空格而不是空字符串替换匹配项。

答案 1 :(得分:2)

此解决方案使用两个正则表达式。第一个正则表达式将整个文件/字符串拆分为三个块:

  1. 第一个块(捕获到组$1)是从字符串开头到第一个HTML开始标记的所有内容。
  2. 第二个块(捕获到组$2)是第一个HTML开始标记之后的所有内容,直到最后一个HTML关闭标记的开头。
  3. 第三个块(捕获到组$3)包括最后一个HTML结束标记以及一直到文件/字符串末尾的所有内容。
  4. 该函数首先尝试将正则表达式与输入文本进行匹配。如果匹配,则使用第二个正则表达式删除最外层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标记(但这应该非常罕见)。