【问题标题】:select words excluding some specific ones - regular expression选择不包括某些特定单词的单词 - 正则表达式
【发布时间】:2019-12-21 17:27:29
【问题描述】:

我正在尝试匹配句子中的单词,不包括以 @ 开头的单词。

不排除以@开头的单词的原始模式如下:

>>> import re
>>> token_pattern_o='(?u)\\b\\w\\w+\\b'
>>> re.search(token_pattern_o, "@mutt")
<re.Match object; span=(1, 5), match='mutt'>

现在我只是为排除添加一个否定的前瞻:

>>> token_pattern = '(?u)\\b^(?!@)\\w\\w+\\b'
>>> re.search(token_pattern, "#mutt")
>>> re.search(token_pattern, "@mutt")
>>> re.search(token_pattern, "mutt")
<re.Match object; span=(0, 4), match='mutt'>
>>> re.search(token_pattern, "_mutt")
<re.Match object; span=(0, 5), match='_mutt'>

问题是,它排除了以任何特殊字符开头的每个单词。

有没有办法实现我想要实现的目标?

【问题讨论】:

    标签: python regex regex-negation


    【解决方案1】:

    我相信您正在寻找以下内容:

    token_pattern = '(?u)\\b(?<!@)\\w\\w+\\b'
    

    也就是说,请帮我一个忙:

    token_pattern = r'(?u)\b(?<!@)\w\w+\b'
    

    【讨论】:

    • 哇!你能解释一下它是如何工作的吗?
    【解决方案2】:

    您是要删除字符还是排除整个单词?

    import re
    
    patt = re.compile(r'[^@]\w*')
    
    print(patt.search('mutt'))
    print(patt.search('#mutt'))
    print(patt.search('@mutt'))
    print(patt.search('%mutt'))
    print(patt.search('^mutt'))
    

    会给出这个输出:

    <re.Match object; span=(0, 4), match='mutt'>
    <re.Match object; span=(0, 5), match='#mutt'>
    <re.Match object; span=(1, 5), match='mutt'>
    <re.Match object; span=(0, 5), match='%mutt'>
    <re.Match object; span=(0, 5), match='^mutt'>
    

    将模式更改为:

    patt = re.compile(r'[^@]?\w*')
    

    将提供此输出:

    <re.Match object; span=(0, 4), match='mutt'>
    <re.Match object; span=(0, 5), match='#mutt'>
    <re.Match object; span=(0, 0), match=''>
    <re.Match object; span=(0, 5), match='%mutt'>
    <re.Match object; span=(0, 5), match='^mutt'>
    

    【讨论】:

      【解决方案3】:

      另一种选择是匹配单个单词字符,并断言左边的不是@

      如果是这种情况,匹配 1+ 个单词字符并在模式的开头和结尾使用单词边界。

      (?u)\b\w(?<!@\w)\w+\b
      

      部分

      • (?u) unicode 的内联标志(或使用 re.U
      • \b字边界
      • \w匹配一个单词char
      • (?&lt;! 负向后看,断言左边的不是
        • @\w 匹配 @ 和单个单词 char
      • ) 近距离观察
      • \w+匹配1+字字符
      • \b字边界

      Regex demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-25
        相关资源
        最近更新 更多