Python正则表达式替换包含字符串的双换行分隔段落

Python正则表达式替换包含字符串的双换行分隔段落,python,regex,Python,Regex,将段落定义为一个多行字符串,两边用两行新行('\n\n')分隔。如果存在包含某个字符串(“BAD”)的段落,我想用其他标记(“GOOD”)替换该段落(即任何包含BAD的文本,直到最近的前后双换行符)。这应该是一个Python3正则表达式 我有如下文本: dfsdf\n sdfdf\n \n blablabla\n blaBAD\n bla\n \n dsfsdf\n sdfdf 应该是: dfsdf\n sdfdf\n \n GOOD\n \n dsfsdf\n sdfdf 给你: /\n\

将段落定义为一个多行字符串,两边用两行新行('\n\n')分隔。如果存在包含某个字符串(“BAD”)的段落,我想用其他标记(“GOOD”)替换该段落(即任何包含BAD的文本,直到最近的前后双换行符)。这应该是一个Python3正则表达式

我有如下文本:

dfsdf\n
sdfdf\n
\n
blablabla\n
blaBAD\n
bla\n
\n
dsfsdf\n
sdfdf
应该是:

dfsdf\n
sdfdf\n
\n
GOOD\n
\n
dsfsdf\n
sdfdf
给你:

/\n\n(?:[^\n]|\n(?!\n))*BAD(?:[^\n]|\n(?!\n))*/g
好的,把它分解一下(因为它看起来很脏):

  • \n\n
    匹配两个文字换行符
  • (?:[^\n]|\n(?!\n))*
    是一个非捕获组,它匹配一个非换行字符或一个不后跟另一个换行字符的换行字符。我们重复整个组0次或更多次(如果
    BAD
    出现在段落开头)
  • BAD
    将匹配您想要的文本。很简单
  • 然后我们使用与上面相同的结构来匹配段落的其余部分
然后,您只需将其替换为
\n\nGOOD
,就可以开始比赛了


首先,在您的示例中,您混合了实际的换行符和
'\n'
字符,我假设您的意思是两者都有。其次,让我挑战你的假设,你需要正则表达式来实现这一点:

inp = '''dfsdf
sdadf

blablabla
blaBAD
bla

dsfsdf
sdfdf'''

replaced = '\n\n'.join(['GOOD' if 'BAD' in k else k for k in inp.split('\n\n')])
结果是

print(replaced)
'dfsdf\nsdadf\n\nGOOD\n\ndsfsdf\nsdfdf'

列表理解的巧妙使用。从我这里得到+1。谢谢,@Sebastian:)事实上,这个问题闻起来很像家庭作业,我只是回答了,因为这不是OP要求的;)@安德拉斯:当你有一个真正的单词问题,你想把它放在stackoverflow上,你会对它进行简化的假设,并尝试做出一个严格的定义。这可能会导致它有一个比提问更简单的解决方案和/或看起来像家庭作业。你还是很棒@eyaler哈哈,谢谢,没关系:D,尽管MCVE()中的C部分表示您的问题规范应该反映您的实际问题以获得最大效率;)无论如何,将来可能会有人偶然发现你的问题,他们甚至可能会从这种方法中受益。因此,在python中,简化一点:re.sub('(.(?@eyaler:简化的正则表达式不会给出你在问题中描述的行为,而且它的效率要低得多。你需要添加单行标志来获得它(相当于DOTALL)