2017-01-19 3 views
0

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

https://docs.python.org/2/howto/regex.html#lookahead-assertions

Я хочу, чтобы исключить файлы, которые заканчиваются в .pqr.gz, и я не совсем уверен, как это сделать.

например, ожидаемое поведение: -

f1.gz => succeed 
f1.abc.pqr => succeed 
f1.pqr.gz => fail 
f1.abc.gz => succeed 

Лучшее регулярное выражение я мог придумать было: -

r'.*[.](?=[^.]*[.][^.]*)(?!pqr[.]gz$)[^.]*[.][^.]*$' 

Это исключает файлы, которые заканчиваются в .pqr.gz, но Безразлично» t, например, разрешить файлы, которые являются только f1.gz (т.е. первый случай, который я написал выше).

Любые идеи о том, как это можно улучшить?

EDIT: - Есть лучшие способы сделать это (например, используя string.endswith), но мне интересно, как это сделать с регулярным выражением только как упражнение.

+4

вы не должны использовать регулярные выражения для проверки суффиксы. –

+2

'. * (?

+0

@Rawing Это работает. Можете ли вы написать это как ответ (надеюсь, с объяснением), и я приму это. – owagh

ответ

0

хорошо, TBH, ваше использование регулярных выражений кажется излишним для меня. Вы можете просто:

if not '.pqr.gz' in line: 
    print(line) 

и сделано.

На самом деле, «простой» строка манипуляция может сделать много всего за несколько простых операций, таких как:

for line in lines: 
    file, result = line.split(' => ') 
    if file.endswith('.pqr.gz'): 
     print("Skipping file {}".format(file), file=sys.stderr) 
     continue 
    print(file) 
    # and you could do something if result == "success" there after! 

, как вы настаиваете делать это с регулярными выражениями:

вот текущий регулярное выражение представление

Regular expression visualization

И вот решение вдохновленной из @rawing предложения:

.*(?<!\.pqr\.gz) => 

Regular expression visualization

+1

По крайней мере используйте 'str.endswith' .. – L3viathan

+0

Я думаю, я должен упомянуть, что это больше умственное упражнение в использовании регулярных выражений, чем для какой-либо практической цели. – owagh

+0

, но вы хотите отфильтровать расширения, не являясь gz или pqr вправо? –

-1

Одна вещь, чтобы быть в курсе с re модуля Python является то, что re.match неявно привязывает к началу строки.

Кроме того, вы можете сопоставлять литеральные периоды, экранируя их (\.), что, вероятно, легче читать (и потенциально быстрее), чем помещать его в класс символов.

re.match Для следующих регулярных выражений следует сделать трюк:

r'.*\.pqr\.gz$' 

При использовании re.search вместо этого, регулярное выражение может быть сокращен только это:

r'\.pqr\.gz$' 
+0

Еще одна вещь, о которой нужно знать при работе с re.match, заключается в том, что вы должны предоставить свой собственный привязку к END строки. Есть два варианта: '\ Z' и' $ '...' $ 'есть похмелье от perl. Используйте '\ Z' –

+0

Опять же,' \ Z' предпочтительнее, если вы явно хотите, чтобы привязка новых строк была учтена в инструкции соответствия. '$' это не просто похмелье от perl, но и другой якорь. Например, если вы пытаетесь сопоставить конец строки, а не конец строки, особенно при использовании 'flags = re.MULTILINE',' \ Z' является неправильным выбором. – KingRadical

+0

Снова посмотрим на вопрос OP ... хочет строки, заканчивающиеся на «foo», а не «foo \ n» –