使用python脚本,我正在清理一段想要替换以下单词的文本:
推广代码,宣传代码,代码,优惠券,优惠券代码,代码.
但是,如果它们以“#”开头,我不想替换它们。因此,#、#promo、#code、#优惠券应该保持原样。
我试着跟随它的正则表达式:
1. \b(promocode|promo code|promo|coupon code|code|coupon)\b
2. (?<!#)(promocode|promo code|promo|coupon code|code|coupon)
他们都不起作用。,我基本上是在寻找一些东西,可以让我说“不要以#和开头”()(推广代码\\promo代码\
有什么建议吗?
发布于 2015-08-21 01:05:44
你需要用消极的眼光看:
(?<!#)\b(?:promocode|promo code|promo|coupon code|code|coupon)\b
这个(?<!#)
将确保您只匹配这些单词,如果在它们之前没有#
,\b
将确保您只匹配整个单词。非捕获组(?:...)
仅用于分组目的,以避免在列表中的每个选项(例如\bpromo\b|\bcode\b
.)周围重复\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))
关于你的正则表达式的几句话。
\b(promocode|promo code|promo|coupon code|code|coupon)\b
是好的,但它也匹配替换组中没有#
前面的单词。
(?<!#)(promocode|promo code|promo|coupon code|code|coupon)
正则表达式更好,但仍然不匹配所有单词(参见这个演示)。
https://stackoverflow.com/questions/32136439
复制