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

时间:2016-10-17 00:16:51

标签: python regex

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

我的文字如下:

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

2 个答案:

答案 0 :(得分:5)

你在这里:

/\n\n(?:[^\n]|\n(?!\n))*BAD(?:[^\n]|\n(?!\n))*/g

好的,稍微分解一下(因为它看起来很讨厌):

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

然后,您只需将其替换为\n\nGOOD,即可参加比赛。

Demo on Regex101

答案 1 :(得分:4)

首先,您在示例中混合了实际换行符和'\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'