在Python中进行反向模式匹配的正则表达式

3

尝试使用负向前瞻来替换所有不符合模式的字符串:

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

#Expected Correct Output:  'PPPPPPword1PPPPPPword2PPPPPword3PPP'

#BAD Output:  'jsdjsqd word1dsqsqsword2fjsdjswrod3sqdq'

我尝试了这个,但它没有起作用(字符串仍然相同)。 如何修改它?(我认为这是非常困难的正则表达式)

1
发布一个样本数据以及预期输出。 - Avinash Raj
1
дҪ жғіжӣҝжҚўжүҖжңүдёҚеҢ…еҗ«word1жҲ–word2жҲ–word3зҡ„еӯ—з¬ҰдёІеҗ—пјҹr'(?s)^(?!.*(?:word1|word2|word3)).*$'гҖӮе®ғдёҚиғҪеҫҲеҘҪең°е·ҘдҪң - е®ғеҜ№дҪ жқҘиҜҙжҳҜеҰӮдҪ•е·ҘдҪңзҡ„пјҢжңүд»Җд№Ҳй—®йўҳпјҹ - Wiktor Stribiżew
上面的代码会引发一个众所周知的“无内容可重复”错误(https://dev59.com/fnA65IYBdhLWcg3wsw8X)。 - Wiktor Stribiżew
你提交的代码似乎也无法正常工作。有什么想法吗? - user5497885
@quantCode:什么代码?哪里出了问题?“My text with word1”字符串包含“word1”,因此不匹配。请参见此演示。“r'(?s)^(?!.(?:word1|word2|word3)).$'”匹配任何没有“word1”,“word2”或“word3”的字符串。 - Wiktor Stribiżew
显示剩余4条评论
2个回答

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演示
正则表达式为(word1|word2|word3)|.,其含义如下:
  • (word1|word2|word3):匹配 word1word2 或者 word3 中的一个字符序列。
  • |:或者...
  • .:任何字符(包括新行符,因为 re.S DOTALL 模式已开启)。
请参考正则表达式演示

好的,如果我们想要这个输出:“Pword1Pword2Pword3P”,我们需要再做另一步吗? - user5497885
你可以使用一个带有限制的贪婪模式匹配工具,像这样:re.compile(r'(word1|word2|word3)|(?:(?!word1|word2|word3).)*', re.S) - Wiktor Stribiżew

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接