用re.search否定(查找不包含特定字符的字符串)

时间:2014-04-29 04:46:03

标签: regex python-2.7 regex-negation

我试图让re.search找到其中没有字母p的字符串。我的正则表达式代码返回列表中的所有内容,这是我不想要的。我写了一个替代解决方案,它给了我想要的确切结果,但我想看看是否可以用re.search解决这个问题,但我也接受另一个正则表达式解决方案。我也尝试re.findall并且没有用,re.match无法工作,因为它在字符串的开头查找模式。

import re

someList = ['python', 'ppython', 'ython', 'cython', '.python', '.ythop', 'zython', 'cpython', 'www.python.org', 'xyzthon', 'perl', 'javap', 'c++']

# this returns everything from the source list which is what I DON'T want
pattern = re.compile('[^p]')
result = []

for word in someList:
    if pattern.search(word):
        result.append(word)
print '\n', result
''' ['python', 'ppython', 'ython', 'cython', '.python', '.ythop', 'zython', 'cpython', 'www.python.org', 'xyzthon', 'perl', 'javap', 'c++'] '''

# this non regex solution returns the results I want
cnt = 0; no_p = []

for word in someList:
    for letter in word:
        if letter == 'p':
            cnt += 1
            pass
    if cnt == 0:
        no_p.append(word)
    cnt = 0
print '\n', no_p
''' ['ython', 'cython', 'zython', 'xyzthon', 'c++'] '''

2 个答案:

答案 0 :(得分:3)

你快到了。您正在使用的模式是寻找至少一个不是'p'的字母。你需要一个更严格的。尝试:

pattern = re.compile('^[^p]*$')

答案 1 :(得分:2)

你对字符集否定的理解是有缺陷的。正则表达式[^p]将匹配其中包含p以外字符的任何字符串,这是您的所有字符串。为了"否定"正则表达式,简单地否定if语句中的条件。所以:

import re

someList = ['python', 'ppython', 'ython', 'cython', '.python', '.ythop', 'zython', 'cpython', 'www.python.org', 'xyzthon', 'perl', 'javap', 'c++']

pattern = re.compile('p')
result = []
for word in someList:
    if not pattern.search(word):
        result.append(word)
print result

当然,使用正则表达式来查看字符串中是否存在单个特定字符是毫无意义的。你的第二次尝试更适合这种情况,但可以更好地编码:

result = []
for word in someList:
    if 'p' not in word:
        result.append(word)
print result