我知道可以匹配一个单词,然后用其他工具逆转比赛(例如 grep -v)。但是,可以匹配不包含一个特定的单词,例如 hede,使用常规表达式的线条吗?
入口:
hoho
hihi
haha
hede
代码:
grep "<Regex for 'doesn't contain hede'>" input
所需的产量:
hoho
hihi
haha
我知道可以匹配一个单词,然后用其他工具逆转比赛(例如 grep -v)。但是,可以匹配不包含一个特定的单词,例如 hede,使用常规表达式的线条吗?
入口:
hoho
hihi
haha
hede
代码:
grep "<Regex for 'doesn't contain hede'>" input
所需的产量:
hoho
hihi
haha
当前回答
答案:
^((?!hede).)*$
解释:
^ 序列的开始,(组和捕获到 \1 (0 或更多次(匹配尽可能多的数量)),(?! 向前看,看看是否存在,
把你的绳子,
(注:因为你在捕获中使用量子,只有捕获模式的最后重复将存储在1美元之前的选项,而字符的结尾。
其他回答
答案:
^((?!hede).)*$
解释:
^ 序列的开始,(组和捕获到 \1 (0 或更多次(匹配尽可能多的数量)),(?! 向前看,看看是否存在,
把你的绳子,
(注:因为你在捕获中使用量子,只有捕获模式的最后重复将存储在1美元之前的选项,而字符的结尾。
请注意,解决方案不会从“现在”开始:
^(?!hede).*$
一般来说,它比解决方案不包含“这些”的更有效:
^((?!hede).)*$
前者只在输入行的第一个位置检查“点”而不是每个位置。
此前提到的(?(?!)*是很棒的,因为它可以被 anchored。
^(?:(?!hede).)*$ # A line without hede
foo(?:(?!hede).)*bar # foo followed by bar, without hede between them
但在这种情况下,以下几点就足够了:
^(?!.*hede) # A line without hede
此简化已准备好添加“和”条款:
^(?!.*hede)(?=.*foo)(?=.*bar) # A line with foo and bar, but without hede
^(?!.*hede)(?=.*foo).*bar # Same
# 一个简单的方式
import re
skip_word = 'hede'
stranger_char = '虩'
content = '''hoho
hihi
haha
hede'''
print(
'\n'.join(re.findall(
'([^{}]*?)\n'.format(stranger_char),
content.replace(skip_word, stranger_char)
)).replace(stranger_char, skip_word)
)
# hoho
# hihi
# haha
我能找到的最简单的事情就是
[^(hede)]
在 https://regex101.com/ 上测试
您也可以在该网站上添加单元测试案例