【问题标题】:Python Regex match everything except words that start with a hashtagPython Regex 匹配除以标签开头的单词之外的所有内容
【发布时间】:2021-08-24 19:50:29
【问题描述】:

我正在尝试使用 Python 正则表达式匹配所有不以主题标签开头的单词。

例句:

    This is #a test for #matching #hashtags

我希望匹配以下内容:这是测试

我能够将所有以井号标签开头的单词与以下内容匹配:#\b\w*

然后我意识到我需要相反的。

我尝试了许多类似的变体但没有成功:

  • ^(?#\b\w*)
  • ^(?!#)\w+$
  • ^(?!#).*
  • /([\s\S]*?)(#)
  • ^(?:(?!#).)*$

没有任何作用。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    如果你想要一个正则表达式,你需要一个 Negative Lookbehind

    (?<!#)\b\w+

    https://regex101.com/r/aMdc7R/1

    【讨论】:

      【解决方案2】:

      非正则表达式解决方案应该没问题:

      >>> text = 'This is #a test for #matching #hashtags'
      >>> [word for word in text.split(' ') if not word.startswith('#')]
      ['This', 'is', 'test', 'for']
      

      对于正则表达式,您需要使用诸如否定后向断言之类的东西,仅当子字符串前面没有指定的子字符串/字符时才会匹配。

      【讨论】:

        【解决方案3】:

        为防止在匹配之前在每个位置触发后视,您可以切换单词边界和后视(因为环视可能很昂贵),并且在断言单词边界后触发后视。

        \b(?<!#)\w+
        
        • \b一个字边界
        • (?&lt;!#) 负向后视,断言不是 # 直接在当前位置的左侧
        • \w+ 匹配 1+ 个单词字符

        Regex demo

        【讨论】:

          猜你喜欢
          • 2011-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多