正则表达式的NOT运算符

时间:2015-08-21 09:03:34

标签: python regex

使用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)

他们都没有工作。 我基本上看起来会让我说“不要以#和#”开头(promocode |促销代码|促销|优惠券代码|代码|优惠券)

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

你需要使用负面的后视:

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

如果(?<!#)之前没有#,则此\b将确保您只匹配这些字词,(?:...)将确保您只匹配整个字词。非捕获组\b仅用于分组目的,以便不在列表中的每个替代项周围重复\bpromo\b|\bcode\b(例如Match ...)。为什么要使用非捕获组?这样它就不会干扰promo结果。我们不需要花费不必要的开销来挖掘我们需要的值(=组)。

请参阅demo here

请参阅IDEONE demo,仅删除第一个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)之前的交替组中的字词。

if(condition1) { if(condition2) { statement1 ; } statement2 ; } 正则表达式更好,但您仍然不匹配整个单词(请参阅this demo)。