使用正则表达式在多行字符串中使用。(点)匹配除少数字符之外的所有字符

时间:2013-11-14 10:36:25

标签: python regex

我的输入字符串如下:

The dog is  black 
and beautiful

The dog and the cat
is black and beautiful

我只想在没有描述猫的情况下将'黑色'替换为'黑暗'。 所以我的输出应该是

The dog is  dark 
and beautiful

The dog and the cat
is black and beautiful


pRegex = re.compile(r'(The.*?(?!cat)ful)', re.DOTALL)
for i in  pRegex.finditer(asm_file):
    res = i.groups()
    print res

这样,在这两种情况下都会替换“黑色”。

正则表达式有什么问题吗? 我正在使用python 2.7

由于

1 个答案:

答案 0 :(得分:0)

Regexp 无法根据一般的否定表达式(“不包含Z”)来描述字符串。在你的情况下,你试图表达像“以X开头并以Y结尾但不包含 Z的字符串”。在regexp中无法使用 NOT 。你的模式表达的是:“一个以X开头,以Y结尾,至少包含一个不是Z的地方的字符串。”这没有用。

我建议搜索更通用的表达式,然后使用像if 'cat' is in i:这样的测试来测试它。这是直截了当的,每个人都能理解这一点。

更复杂的方法可能是搜索两个正则表达式的替代(OR),第一个是匹配此类表达式 cat内部,另一个匹配所有具有该开始和结束部分的表达式。如果您随后捕获了不同组中的两个替代方案,您可以轻松地决定填充哪个替代组(有或没有猫)。但这只有在你可以指定组之间的真正分隔符时才有效,我认为你不能;-)无论如何这里是我的意思的一个例子:

r = re.compile(r'(The[^|]*?cat[^|]*?ful)|(The[^|]*?ful)')
text = 'The dog is  black and beautiful | The dog and the cat is black and beautiful'
for i in r.finditer(text):
  print i.groups()

打印:

(None, 'The dog is  black and beautiful')
('The dog and the cat is black and beautiful', None)