RegEx查找部分但排除If

时间:2013-07-31 16:12:43

标签: python regex

是的,所以RegExp对我来说还是一个新手,它仍然令我感到困惑。无论如何,我设法找到了我想要的几乎所有名字,但现在我必须寻找具有特定部分世界的名称,但如果旁边还有另一个名称则排除。

所以基本上

查找"Cat"但是如果有"Dog"则排除此字符串,以便:

CatBlablablaDog = exclude
blablaCatBlabla = include
Dog_blabla_Cat = exclude

Atm我正在用它来寻找我的名字 '*Cat*'我想我也可以使用/*.Cat/或类似的东西(我无法记住我在某处写的确切符号) 那么我必须添加什么才能排除Dog对象? (我用Python编写代码)

如果我不能这样做,也许我可以遍历对象并寻找除Dog之外的其他名字。然后遍历Cat名称的新非狗名称?这意味着我键入什么不寻找狗的名字? :)

谢谢,再见。

2 个答案:

答案 0 :(得分:2)

使用否定前瞻:

^(?!.*dog).*cat.*$

首先测试字符串中没有dog。如果负前瞻成功,则继续匹配包含cat的字符串。您可能希望使用(?i)标志在其中启用忽略大小写。

在python中,您还可以使用re.IGNORECASE

>>> import re
>>> ignorecase = re.compile(r'(?i)(?!.*dog).*cat.*')
>>> print ignorecase.match("CatBlablablaDog")
None
>>>
>>> print ignorecase.match("blablaCatBlabla")
<_sre.SRE_Match object at 0x956b090>
>>>
>>> print ignorecase.match("Dog_blabla_Cat")
None

答案 1 :(得分:1)

@Rohit Jain's answer

提供替代的非正则表达式解决方案

没有正则表达式的单行(在中播放):

>>> (lambda s: 'cat' in s and 'dog' not in s)("CatBlablablaDog".lower())
False
>>> (lambda s: 'cat' in s and 'dog' not in s)("blablaCatBlabla".lower())
True
>>> (lambda s: 'cat' in s and 'dog' not in s)("Dog_blabla_Cat".lower())
False

使用某种更正式的功能:

def findExclude(string, search_str, exclude_str):
    string = string.lower()
    return search_str in string and exclude_str not in string

print findExclude("CatBlablablaDog", 'cat', 'dog')
print findExclude("blablaCatBlabla", 'cat', 'dog')
print findExclude("Dog_blabla_Cat", 'cat', 'dog')