В чем разница между re.search и re.match?

Получение какой-либо даты модификации кросс-платформенным способом легко - просто вызовите os.path.getmtime(path) , и вы получите отметку времени Unix, когда последний файл в path был последним изменен.

Получение дат создания файла , с другой стороны, неудобно и зависит от платформы, различающееся даже между тремя большими ОС:

  • Вкл. Windows, файл ctime файла (задокументированный в https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx ) сохраняет дату создания. Вы можете получить доступ к этому в Python через os.path.getctime() или атрибут .st_ctime результата вызова os.stat() . Этот не будет работать в Unix, где ctime - последний раз, когда атрибуты или содержимое файла были изменены .
  • На Mac, а также некоторые другие ОС на базе Unix, вы можете использовать атрибут .st_birthtime результата вызова os.stat().
  • В Linux это невозможно в настоящее время , по крайней мере, без написания расширения C для Python. Хотя некоторые файловые системы, обычно используемые с Linux , создают даты создания хранилища (например, ext4 хранит их в st_crtime), ядро ​​Linux не имеет доступа к ним ; в частности, структуры, которые он возвращает из вызовов stat() в C, начиная с последней версии ядра, не содержат полей даты создания . Вы также можете видеть, что идентификатор st_crtime в настоящее время не присутствует нигде в источнике Python . По крайней мере, если вы находитесь на ext4, данные - , прикрепленные к inodes в файловой системе, но нет удобного способа доступа к нему. Следующей лучшей идеей в Linux является доступ к файлу mtime с помощью либо os.path.getmtime() , либо атрибута .st_mtime результата os.stat(). Это даст вам последний раз, когда содержимое файла было изменено, что может быть подходящим для некоторых случаев использования.

Положив все это вместе, межплатформенный код должен выглядеть примерно так ...

import os
import platform

def creation_date(path_to_file):
    """
    Try to get the date that a file was created, falling back to when it was
    last modified if that isn't possible.
    See http://stackoverflow.com/a/39501288/1709587 for explanation.
    """
    if platform.system() == 'Windows':
        return os.path.getctime(path_to_file)
    else:
        stat = os.stat(path_to_file)
        try:
            return stat.st_birthtime
        except AttributeError:
            # We're probably on Linux. No easy way to get creation dates here,
            # so we'll settle for when its content was last modified.
            return stat.st_mtime

441
задан martineau 27 January 2018 в 01:28
поделиться

3 ответа

re.match привязывается в начале строки. Это не имеет никакого отношения к новым строкам, таким образом, это не то же как использование ^ в шаблоне.

Как в re.match документации говорится:

, Если нуль или больше символов в начало строки соответствует образцу регулярного выражения, возвратите соответствие MatchObject экземпляр. Возвратитесь None, если строка не соответствует шаблону; обратите внимание, что это отличается от соответствия нулевой длины.

Примечание: Если Вы хотите определить местоположение соответствия где-нибудь в строке, используйте search() вместо этого.

re.search поиски вся строка, как [1 123] в документации говорится :

Сканирование через строку поиск местоположения, где образец регулярного выражения производит соответствие и возвращает соответствие MatchObject экземпляр. Возвратитесь None, если никакое положение в строке не соответствует шаблону; обратите внимание, что это отличается от нахождения соответствия нулевой длины в какой-то момент в строке.

Поэтому, если необходимо соответствовать в начале строки, или соответствовать всему строковому использованию match. Это быстрее. Иначе используйте search.

документация имеет определенный раздел для [1 111] по сравнению с [1 112] , который также покрывает многострочные строки:

Python предлагает две различных примитивных операции на основе регулярных выражений: match проверки на соответствие только вначале из строки, в то время как search проверки на соответствие где угодно в строке (это - то, что Perl делает по умолчанию).

Примечание, что match может отличаться от [1 116] даже когда с помощью регулярного выражения, начинающегося '^': '^' соответствия только в начале строки, или в [1 119] режим также сразу после новой строки. “ match ” операция успешно выполняется , только если матчи шаблона в эти начинаются из строки независимо от режима, или в стартовой позиции, данной дополнительным pos аргумент независимо от того, предшествует ли новая строка ему.

Теперь, достаточно разговора. Время для наблюдения некоторого примера кода:

# example code:
string_with_newlines = """something
someotherthing"""

import re

print re.match('some', string_with_newlines) # matches
print re.match('someother', 
               string_with_newlines) # won't match
print re.match('^someother', string_with_newlines, 
               re.MULTILINE) # also won't match
print re.search('someother', 
                string_with_newlines) # finds something
print re.search('^someother', string_with_newlines, 
                re.MULTILINE) # also finds something

m = re.compile('thing, re.MULTILINE)

print m.match(string_with_newlines) # no match
print m.match(string_with_newlines, pos=4) # matches
print m.search(string_with_newlines, 
               re.MULTILINE) # also matches
448
ответ дан Vin 27 January 2018 в 01:28
поделиться

re.search поиск es для шаблона всюду по строке , тогда как re.match делает не, ищут шаблон; если это не делает, это не имеет никакого другого выбора, чем к соответствие это в начале строки.

46
ответ дан tzot 27 January 2018 в 01:28
поделиться

re.match пытается соответствовать шаблону в начале строки . re.search пытается соответствовать шаблону всюду по строке , пока это не находит соответствие.

14
ответ дан cschol 27 January 2018 в 01:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: