使用 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)。
我是一名优秀的程序员,十分优秀!