select 个词,不包括某些特定词 - 正则表达式

select words excluding some specific ones - regular expression

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

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

>>> 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'>

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

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

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

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

话虽如此,请帮我一个忙:

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

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

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'>

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

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

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

部分

  • (?u) unicode 的内联标志(或使用 re.U
  • \b 字边界
  • \w 匹配一个单词char
  • (?<!负向后视,断言直接在左边的不是
    • @\w匹配@和单个单词char
  • ) 关闭回顾
  • \w+ 匹配 1+ 个单词字符
  • \b 字边界

Regex demo