Skip to main content
 首页 » 编程设计

python之正则表达式的 NOT 运算符

2025年05月04日60fff_TT

使用 python 脚本,我正在清理一段文本,我想在其中替换以下单词:
促销代码,促销代码,优惠券,优惠券代码,代码。

但是,如果它们以“#”开头,我不想替换它们。因此,#promocode、#promo、#code、#coupon 应该保留他们的方式。

我尝试使用正则表达式:

1. \b(promocode|promo code|promo|coupon code|code|coupon)\b 
2. (?<!#)(promocode|promo code|promo|coupon code|code|coupon) 

他们都没有工作。 我基本上是在寻找可以让我说“不以 # 和开头”的东西(促销代码|促销代码|促销|优惠券代码|代码|优惠券)

有什么建议吗?

请您参考如下方法:

你需要使用负面回顾:

(?<!#)\b(?:promocode|promo code|promo|coupon code|code|coupon)\b 

(?<!#)如果没有#,将确保您只会匹配这些词在他们之前和\b将确保您只匹配整个单词。非捕获组(?:...)仅用于分组目的,以免重复 \b围绕列表中的每个备选方案(例如 \bpromo\b|\bcode\b ...)。为什么要使用非捕获组?这样它就不会干扰 Match结果。我们不需要不必要的开销来挖掘我们需要的值(=组)。

参见 demo here

参见 IDEONE demo , 只有第一个 promo被删除:

import re 
p = re.compile(r'(?<!#)\b(?:promocode|promo code|promo|coupon code|code|coupon)\b') 
test_str = "promo #promo " 
print(p.sub('', test_str)) 

关于正则表达式的几句话。

\b(promocode|promo code|promo|coupon code|code|coupon)\b很好,但它也匹配交替组中不以 # 开头的词.

(?<!#)(promocode|promo code|promo|coupon code|code|coupon)正则表达式更好,但您仍然无法匹配整个单词(请参阅 this demo)。