【问题标题】:Python regex - Replace all but a few wordsPython regex - 替换除几个单词之外的所有单词
【发布时间】:2016-04-26 10:47:35
【问题描述】:

假设你有以下字符串:

"badger randomword badger mushroom mushroom somethingelse"

我想保留“badger”和“mushroom”这两个词,并用“mushroom”替换所有其他词:

"badger mushroom badger mushroom mushroom mushroom"

但我找不到一个正则表达式来匹配“除了獾和蘑菇这两个词之外的所有内容”。你能帮帮我吗?

【问题讨论】:

  • 检查bader或蘑菇,否定它?
  • 我可以发布一个非正则表达式的答案,这样也可以吗?正则表达式有时过于强大!
  • 非正则表达式方式是:" ".join([x if x == 'badger' else 'mushroom' for x in "badger randomword badger mushroom mushroom somethingelse".split()])跨度>

标签: python regex regex-negation


【解决方案1】:

这会起作用

(?!\bbadger\b|\bmushroom\b)\b[^\s]+\b

Regex Demo

Python 代码

p = re.compile(r'(?!\bbadger\b|\bmushroom\b)\b[^\s]+\b')
test_str = "badger randomword badger mushroom mushroom somethingelse"
subst = "mushroom"
result = re.sub(p, subst, test_str)

Ideone Demo

【讨论】:

  • @EduardoAlmeida 您可以使用该网站regex101.com 它对正则表达式中发生的事情有一些简要说明
【解决方案2】:

执行此任务的简单非正则表达式 oneliner 将是 -

new_string = ' '.join(word if word == 'badger' else 'mushroom' for word in original_string.split())

我建议不要在这里使用复杂的正则表达式,因为 Python 中的 Beautiful Is Better Than Ugly

【讨论】:

    【解决方案3】:

    您可以将re.sub 与函数参数一起使用,这将使模式变得非常简单:

    import re
    
    s = "badger randomword badger mushroom mushroom somethingelse"
    re.sub('\w+', lambda x: 'badger' if x.group(0) == 'badger' else 'mushroom', s)
    

    【讨论】:

      【解决方案4】:

      一个非正则表达式的解决方案(并且更容易阅读)是这样的:

      oldstring = "badger randomword badger mushroom mushroom somethingelse"
      newstring = ""
      
      for part in oldstring.split(" "):
          if part in ["badger", "mushroom"]:
              newstring += part
          else:
              newstring += "mushroom"
          newstring += " "
      
      newstring = newstring[:-1]
      

      【讨论】:

        【解决方案5】:

        试试这个

        (?!badger\b)\b\w+\b
        

        Regex demo

        解释:
        (?!…):负前瞻sample
        \:转义特殊字符sample
        \w:“单词字符”: ASCII字母、数字或下划线sample
        +:一个或多个sample

        Python

        import re
        p = re.compile(ur'(?!badger\b)\b\w+\b')
        test_str = u"badger randomword badger mushroom mushroom somethingelse"
        subst = u"mushroom"
        
        result = re.sub(p, subst, test_str)#badger mushroom badger mushroom mushroom mushroom
        

        【讨论】:

          猜你喜欢
          • 2016-04-05
          • 1970-01-01
          • 2014-03-22
          • 1970-01-01
          • 1970-01-01
          • 2020-03-27
          • 1970-01-01
          • 1970-01-01
          • 2020-07-27
          相关资源
          最近更新 更多