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
字边界
我正在尝试匹配句子中不包括以 @
开头的单词的单词。
不排除以@
开头的单词的原始模式如下:
>>> 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
字边界