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

Python 在字符串搜索中使用正则表达式排除字符?,python,regex,string,Python,Regex,String,我正在使用Python2.7.2脚本查找一个文本文件中的单词列表,该文本文件用作主单词列表 我在终端窗口中调用脚本,输入任意数量的正则表达式,然后运行脚本 因此,如果我传入两个正则表达式“^….$”和“*z”,它将打印至少包含一个“z”的每五个字母的单词 我试图做的是添加另一个正则表达式以从字符串中排除字符。我想打印出所有有五个字母的单词,一个“z”,但不是一个“y” 代码如下: import re import sys def read_file_to_set(filename):

我正在使用Python2.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,
重新导入
导入系统
def read_file_to_set(文件名):
字=无
打开(文件名)为f时:
words=[word.lower()表示f.readlines()中的单词]
返回集(字)
def匹配所有(word、正则表达式):
对于正则表达式中的正则表达式:
如果不是regex.search(word):
返回错误
返回真值
如果len(sys.argv)<3:
print“需要一个源字典和一系列正则表达式”
其他:
source=将文件读取到集合(sys.argv[1])
regexes=[re.compile(arg,re.IGNORECASE)
对于sys.argv[2:]
对于已排序的单词(源):
如果匹配所有(word.rstrip(),正则表达式):
印刷字,
我可以在传递给程序的正则表达式上添加哪些修饰符,以允许我从它打印的字符串中排除某些字符


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

指定一个不匹配的字符是这样做的(它匹配除小写字母以外的任何字符):

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

逐字解释:

^
如果位于正则表达式的开头,则表示“开始”。 类似地,
$
如果在结尾,则表示“结束”。
[abAB]
匹配范围内的任何字符。例如,匹配任何十六进制字符(大写或小写):
[a-fA-F0-9]

*
表示前面表达式的0个或多个。 作为
[]
中的第一个字符,
^
具有不同的含义:它表示“不”。所以
[^a-fA-F0-9]
匹配任何非十六进制字符

当您将一个模式放在
^
$
之间时,您会强制正则表达式精确匹配字符串(模式之前或之后没有任何内容)。结合所有这些事实:


^[^y]*$
表示正好是0个或多个非“y”字符的字符串。(要做一些更有趣的事情,你可以检查非数字:
^[^0-9]$
你可以通过
负面环视来完成。这不是regex特别快的任务,但它确实有效。要匹配除子字符串
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
>>my_regex=re.compile(r'^((?!foo)。*$”,flags=re.I)
>>>打印my_regex.match(u'IMatchJustFine')
>>>打印my_regex.match(u'imatchfoofoofine')
没有一个

正如其他人所指出的,如果您只匹配一个字符,那么简单的匹配就不够了。更长更复杂的负匹配需要使用这种方法。

这正是我想要的!您介意解释一下“^[^y]*$中的每个字符是什么吗正在做什么?我刚刚开始使用计算机编程/Python,我在正则表达式的文档中看到了这些字符,但我想不出这样组合它们来获得结果。这是一个非常有用的解释,谢谢。你能解释一下如何组合2个正则表达式'not'/exclude语句吗例如,如果要匹配某个不是y也不是q的字符串,它会是什么样子?@EazyC如果排除是字符,则它只是[^yq]*.如果是全字符串,实际上要困难得多。我不知道该怎么做,但我认为你可以用负lookaheads/lookbehinds来实现。正则表达式是关于匹配字符的,但当涉及到不匹配字符时,它们就没有那么强大了。因此,一些正则表达式引擎甚至不支持lookaheads/lookbehinds。(不同之处在于,它们的匹配不是关于当前角色,而是潜在的未来/以前的角色。)因此,要搜索“不是这个也不是那个”,您需要负向前看/向后看。
>>> 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