Соответствие «~» в конце имени файла с регулярным выражением Python - PullRequest
1 голос
/ 12 июля 2010

Я работаю в скрипте (Python), чтобы найти некоторые файлы.Я сравниваю имена файлов с шаблоном регулярного выражения.Теперь мне нужно найти файлы, заканчивающиеся на «~» (тильда), поэтому я построил это регулярное выражение:

if re.match("~$", string_test):
    print "ok!"

Что ж, Python, похоже, не распознает регулярное выражение, я не знаю почему,Я пробовал такое же регулярное выражение на других языках, и оно отлично работает, любая идея?

PD: Я читаю в сети, что мне нужно вставить

# -*- coding: utf-8 -*-

, но это не помогает :(.

Большое спасибо, а пока я буду продолжать читать, чтобы найти что-нибудь.

Ответы [ 4 ]

10 голосов
/ 12 июля 2010

re.match() успешно, только если регулярное выражение совпадает в начале входной строки.Для поиска любой подстроки используйте re.search() вместо:

if re.search("~$", string_test):
    print "ok!"
9 голосов
/ 12 июля 2010

Ваше регулярное выражение будет соответствовать только строкам "~" и (хотите верьте, хотите нет) "~ \ n".

Вам нужен re.match (r ". * ~ $", Что угодно) ... это означает ноль или более (что угодно, кроме новой строки), за которым следует тильда, за которой следует (конец строки или новая строка, предшествующая конец строки).

В маловероятном случае, когда имя файла может содержать символ новой строки, используйте флаг re.DOTALL и используйте \ Z вместо $.

"работал" на других языках: вы должны были использовать функцию поиска.

r в начале строковой константы означает необработанные переходы, например, '\ n' является новой строкой, но r '\ n' - это два символа, обратный слеш, за которым следует n - который также может быть представлен как \ n. Необработанные переходы сохраняют много \\ в регулярных выражениях, нужно использовать r "регулярное выражение" автоматически

Кстати: в этом случае избегайте путаницы с регулярными выражениями ... используйте what.endswith ('~')

7 голосов
/ 12 июля 2010

Для поиска файлов используйте glob вместо

import os
import glob

path = '/path/to/files'
os.chdir(path)
files = glob.glob('./*~')

print files
0 голосов
/ 12 июля 2010

Правильные регулярные выражения и решение glob уже опубликованы. Другой вариант - использовать модуль fnmatch:

import fnmatch
if fnmatch.fnmatch(string_test, "*~"):
    print "ok!"

Это немного проще, чем использовать регулярное выражение. Обратите внимание, что все методы, размещенные здесь, по существу эквивалентны: fnmatch реализован с использованием регулярных выражений, а glob в свою очередь использует fnmatch.

Обратите внимание, что только в 2009 году патч был добавлен к fnmatch (через шесть лет!), Который добавил поддержку имен файлов с символами новой строки.

...