尝试使用negative forward来替换与模式不匹配的所有字符串:
regexPattern = '((?!*' + 'word1|word2|word3' + ').)*$'
mytext= 'jsdjsqd word1dsqsqsword2fjsdjswrod3sqdq'
return re.sub(regexPattern, "P", mytext)
#Expected Correct Output: 'PPPPPPword1PPPPPPword2PPPPPword3PPP'
#BAD Output: 'jsdjsqd word1dsqsqsword2fjsdjswrod3sqdq'
我试试这个但它不起作用(字符串保持不变)。 如何修改? (认为这是非常困难的正则表达式)
答案 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)
- word1
或word2
或word3
个字符序列|
- 或...... .
- 任何字符(包括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
,而原始字符串中不会出现这种情况。