如何从Python的字符串中删除多次出现的模式?

时间:2019-04-11 22:37:32

标签: python regex

我有兴趣删除Python字符串中所有出现的模式,其中模式看起来像是“ {start-string等等,等等,等等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.'

要删除的块的开始是<mark,结束是/>。因此,我执行以下操作:

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.'

因此很明显,该命令使用的是开头字符串的第一个实例和结尾字符串的最后一个实例。

如何使其与模式匹配两次,并提供所需的输出?这必须很容易,但是尽管搜索了“删除多次出现的regex Python”之类的东西,但我还没有找到答案。谢谢。

1 个答案:

答案 0 :(得分:3)

您基本上想在'<mark'和'/>'之间找到任何内容,因此从模式开始

r'<mark .* />'

但是.*会变得很贪婪,因此要使其变为非贪婪,您需要添加一个?,然后只需使用re.sub用空字符串替换那些匹配项

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