【问题标题】:How do I remove multiple occurrences of a pattern from a string in Python?如何从 Python 中的字符串中删除多次出现的模式?
【发布时间】:2019-04-12 06:40:59
【问题描述】:

我有兴趣删除 Python 字符串中所有出现的模式,其中模式看起来像“start-string blah, blah, blah end-string”。这是我希望能够处理的一般问题。这与How can I remove a portion of text from a string whenever it starts with &*( and ends with )(* 的问题相同,但在 Python 而不是 Java 中。

如何在 Python 中解决同样的问题?

假设字符串如下所示,

'Bla bla bla <mark asd asd asd /> bla bla bla. Yadda yadda yadda <mark alls lkja /> yadda.'

要删除的块的开始是&lt;mark,结束是/&gt;。所以我做了以下事情:

import re
mystring = "Bla bla bla <mark asd asd asd /> bla bla bla. Yadda yadda yadda <mark akls lkja /> yadda."
tags = "<mark", "/>"
re.sub('%s.*%s' % tags, '', mystring)

我想要的输出是

'Bla bla bla  bla bla bla. Yadda yadda yadda  yadda.'

但我得到的是

'Bla bla bla  yadda.'

很明显,该命令使用的是开始字符串的第一个实例和结束字符串的最后一次出现。

如何让它匹配模式两次并给我想要的输出?这必须很容易,但是尽管搜索了“删除多次出现的正则表达式 Python”等,但我还没有找到答案。谢谢。

【问题讨论】:

  • Python non-greedy regexes的可能重复
  • @Robin:我同意。我实际上把贪婪的定义倒过来了。生活和学习。

标签: python regex


【解决方案1】:

你基本上想在'&lt;mark'和'/&gt;'之间找到任何东西,所以你从模式开始

r'<mark .* />'

不过.* 会很贪心,所以要让它不贪心,你需要添加一个?,然后只需使用re.sub 将这些匹配项替换为空字符串

>>> re.sub(r'<mark .*? />', '', s)
'Bla bla bla  bla bla bla. Yadda yadda yadda  yadda.'

【讨论】:

    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2017-07-15
    • 2013-12-15
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多