负模式匹配Reg ex在Python中

时间:2016-03-30 12:45:14

标签: python regex python-3.x regular-language

尝试使用negative forward来替换与模式不匹配的所有字符串:

regexPattern = '((?!*' + 'word1|word2|word3' + ').)*$'  
mytext= 'jsdjsqd word1dsqsqsword2fjsdjswrod3sqdq'
return re.sub(regexPattern, "P", mytext)

#Expected Correct Output:  'PPPPPPword1PPPPPPword2PPPPPword3PPP'

#BAD Output:  'jsdjsqd word1dsqsqsword2fjsdjswrod3sqdq'

我试试这个但它不起作用(字符串保持不变)。 如何修改? (认为​​这是非常困难的正则表达式)

2 个答案:

答案 0 :(得分:3)

您可以使用

import re
regex = re.compile(r'(word1|word2|word3)|.', re.S)
mytext = 'jsdjsqd word1dsqsqsword2fjsdjsword3sqdq'
print(regex.sub(lambda m: m.group(1) if m.group(1) else "P", mytext))
// => PPPPPPPPword1PPPPPPword2PPPPPPword3PPPP

请参阅IDEONE demo

正则表达式为(word1|word2|word3)|.

  • (word1|word2|word3) - word1word2word3个字符序列
  • | - 或......
  • . - 任何字符(包括re.S DOTALL模式的换行符)

请参阅regex demo

答案 1 :(得分:0)

您可以使用两阶段方法:首先,将匹配的字符替换为某个特殊字符,然后将其用作掩码以替换所有其他字符。

>>> text= 'jsdjsqd word1dsqsqsword2fjsdjsword3sqdq'
>>> p = 'word1|word2|word3'
>>> mask = re.sub(p, lambda m: 'X' * len(m.group()), text)
>>> mask
'jsdjsqd XXXXXdsqsqsXXXXXfjsdjsword3sqdq'
>>> ''.join(t if m == 'X' else 'P' for (t, m) in zip(text, mask))
'PPPPPPPPword1PPPPPPword2PPPPPPword3PPPP'

当然,您可能必须选择不同的字符,而不是X,而原始字符串中不会出现这种情况。