使用python脚本,我正在清理一段文本,我想替换下面的单词:
promocode,promo,code,coupon,coupon code,code.
但是,如果他们以'#'开头,我不想替换它们.因此,#promocode,#promo,#code,#coupon应该保持原样.
我尝试使用正则表达式:
1. \b(promocode|promo code|promo|coupon code|code|coupon)\b
2. (?<!#)(promocode|promo code|promo|coupon code|code|coupon)
Run Code Online (Sandbox Code Playgroud)
他们都没有工作.我基本上看起来会让我说"不要以#和#开头"(promocode |促销代码|促销|优惠券代码|代码|优惠券)
有什么建议 ?
你需要使用负面的后视:
(?<!#)\b(?:promocode|promo code|promo|coupon code|code|coupon)\b
Run Code Online (Sandbox Code Playgroud)
这(?<!#)将确保您只有在这些单词#之前没有匹配时才会匹配这些单词,\b并确保您只匹配整个单词.非捕获组(?:...)仅用于分组目的,以便不在\b列表中的每个备选项周围重复(例如\bpromo\b|\bcode\b......).为什么要使用非捕获组?这样它就不会干扰Match结果.我们不需要花费不必要的开销来挖掘我们需要的值(=组).
请参阅IDEONE演示,只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))
Run Code Online (Sandbox Code Playgroud)
关于你的正则表达式的几个词.
这\b(promocode|promo code|promo|coupon code|code|coupon)\b是好的,但它也匹配交替组中没有前面的单词#.
在(?<!#)(promocode|promo code|promo|coupon code|code|coupon)正则表达式是更好的,但你仍然不匹配全字(见本演示).