2013-11-12 3 views
5

Я работаю с скриптом 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, 

Какие модификаторы можно положить на регулярных выражений, которые я прохожу в программу, чтобы для меня, чтобы исключить определенные символы из строки печатаемых?

Если это невозможно, что должно быть реализовано в коде?

ответ

10

Указание символа, который не соответствует делается с так (это соответствует ничего, кроме строчной буквы):

[^a-z] 

Таким образом, чтобы соответствовать строке, которая не содержит «у», регулярное выражение является: ^[^y]*$

посимвольно объяснение:

^ означает «начало», если это происходит в начале регулярного выражения. Аналогичным образом, $ означает «конец», если он приходит в конце. [abAB] соответствует любому символу внутри или диапазону. Например, сопоставьте любой шестнадцатеричный символ (верхний или нижний регистр): [a-fA-F0-9] * означает «0 или более предыдущего выражения». Как первый символ внутри [], ^ имеет другое значение: это означает «нет». Таким образом, [^a-fA-F0-9] соответствует любому несимметричному символу.

Когда вы помещаете шаблон между ^ и $, вы вынуждаете регулярное выражение точно соответствовать строке (ничего до или после шаблона). Объедините все эти факты:

^[^y]*$ означает «строка, которая представляет собой ровно 0 или более символов, которые не являются« y ».» (Для того, чтобы сделать что-то более интересное, вы можете проверить, не являющихся числами: ^[^0-9]$

+1

Это именно то, что я искал! Не могли бы вы объяснить, что делает каждый символ в «^ [^ y] * $? Я только начинаю работать с компьютерным программированием/Python, и я видел каждый из этих символов в документации для регулярных выражений, но не мог подумать, чтобы объединить их так же, как и для этого результата. –

+0

Я отредактировал, чтобы добавить объяснение ко всему. – piojo

+0

Это очень полезное объяснение спасибо. Можете ли вы объяснить, как сделать так, чтобы вы могли комбинировать 2 выражения регулярного выражения 'NOT'/exclude? Например, как бы это выглядело, если бы вы хотели сопоставить некоторую строку, а не y, а также не q? – EazyC

4

Вы можете сделать это с 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 

Как уже отмечалось, если вы только только один символ, то просто не хватит дольше и более сложные отрицательные матчи должны были бы использовать это. подход

Смежные вопросы