使用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 |促销代码|促销|优惠券代码|代码|优惠券)
有什么建议吗?
答案 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)。