使用正则表达式排除字符串搜索中的字符?

Zac*_*ise 10 python regex string

我正在使用Python 2.7.2脚本来查找我正在用作主单词列表的文本文件中的单词列表.

我在终端窗口中调用脚本,输入任意数量的正则表达式,然后运行脚本.

所以,如果我传入两个正则表达式"^ ..... $"和".*z",它将打印包含至少一个"z"的每五个字母单词.

我想要做的是添加另一个正则表达式来从字符串中排除一个字符.我想打印出所有有五个字母的单词,一个是"z",但是 - 不是 - 一个"y".

这是代码:

import re
import sys

def read_file_to_set(filename):
    words = None
    with open(filename) as f:
        words = [word.lower() for word in f.readlines()]
    return set(words)

def matches_all(word, regexes):
    for regex in regexes:
        if not regex.search(word):
            return False
    return True

if len(sys.argv) < 3:
    print "Needs a source dictionary and a series of regular expressions"
else:
    source = read_file_to_set(sys.argv[1])
    regexes = [re.compile(arg, re.IGNORECASE)
               for arg in sys.argv[2:]]
    for word in sorted(source):
        if matches_all(word.rstrip(), regexes):
            print word,
Run Code Online (Sandbox Code Playgroud)

我可以将哪些修饰符放在我传入程序的正则表达式中,以允许我从它打印的字符串中排除某些字符?

如果那是不可能的,那么需要在代码中实现什么?

pio*_*ojo 20

指定不匹配的字符是这样完成的(这匹配小写字母除外):

[^a-z]
Run Code Online (Sandbox Code Playgroud)

因此,要匹配不包含"y"的字符串,正则表达式是: ^[^y]*$

字符解释:

^如果它出现在正则表达式的开头,则意味着"开始".同样,$如果最后出现,意味着"结束". [abAB]匹配任何字符或范围.例如,匹配任何十六进制字符(大写或小写):[a-fA-F0-9]

*表示前一个表达式的0或更多.作为里面的第一个角色[],^有不同的含义:它意味着"不".所以[^a-fA-F0-9]匹配任何非十六进制字符.

当你在^和之间放置一个模式时$,你强制正则表达式与字符串完全匹配(在模式之前或之后没有任何内容).结合所有这些事实:

^[^y]*$表示字符串恰好是0个或更多不是'y'的字符.(要做一些更有趣的事情,你可以检查非数字:^[^0-9]$


Voo*_*OFX 6

你可以用这个完成negative look arounds.这不是Regexs特别快的任务,但确实有效.要匹配除子字符串以外的所有内容foo,您可以使用:

>>> my_regex = re.compile(r'^((?!foo).)*$', flags = re.I)
>>> print my_regex.match(u'IMatchJustFine')
<_sre.SRE_Match object at 0x1034ea738>
>>> print my_regex.match(u'IMatchFooFine')
None
Run Code Online (Sandbox Code Playgroud)

正如其他人所指出的那样,如果你只匹配一个角色,那么简单就不够了.更长和更复杂的负面匹配需要使用这种方法.