我知道可以使用其他工具(例如 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
(
、h
、e
、d
或 )
的单个字符。 - tripleee使用ConyEdit,您可以使用命令行cc.gl !/hede/
获取不包含正则表达式匹配的行,或使用命令行cc.dl /hede/
删除包含正则表达式匹配的行。它们具有相同的结果。
awk '!/hede/'
或 grep -v 'hede'
。 - tripleee# 一个简单的方式
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) 是更好的答案。(?<!whateverYouDontWantToMatch) 是负向零宽后顾,而不是 (?!whateverYouDontWantToMatch) 的负向零宽先行断言。这意味着通过 (?<!) 它将在字符串当前位置进行检查,而不仅仅是在匹配之后。因此例如,在使用 (?!) 时会遇到问题,它仅在此情况下起作用是因为有锚定。
([^h]*(h([^e]|$)|he([^d]|$)|hed([^e]|$)))*
有什么问题吗?它的思想很简单。继续匹配直到看到不想要的字符串的开头,然后只在字符串未完成的N-1种情况下进行匹配(其中N为字符串的长度)。这N-1种情况是“h之后非e”,“he之后非d”和“hed之后非e”。如果你成功通过了这些N-1种情况,那么你就成功地没有匹配上不想要的字符串,所以你可以开始再次寻找[^h]*
。 - stevendesu^([^h]*(h([^e]|$)|he([^d]|$)|hed([^e]|$))?)*$
这个模式在 "hhede" 等包含部分"hede"的实例之前出现时失败了。 - jaytea