RegExp в Python - PullRequest
       39

RegExp в Python

0 голосов
/ 10 марта 2010

Это пример поиска файлов PDF в текущем каталоге.

import os, os.path
import re

def print_pdf (arg, dir, files):
 for file in files:
  path = os.path.join(dir, file)
  path = os.path.normcase(path)
  if re.search(r".*\.pdf", path):
   print path

os.path.walk('.', print_pdf, 0)

Может ли кто-нибудь объяснить, что здесь означает r".*\.pdf"

Почему ".*\"?

Спасибо!

Ответы [ 6 ]

8 голосов
/ 10 марта 2010

означает любой символ ноль или более раз, за ​​которым следуют буквальная точка и буквы pdf (из-за жадного характера звездочки, в основном гарантируется, что '.pdf' будет в конце строки темы) .

Существует модуль glob, который делает это правильно:

>>> glob.glob(os.path.join(dirname, '*.pdf'))
3 голосов
/ 10 марта 2010

Почему ".*\"?

Неправильный вопрос, вы пропустили важный характер выражения. ; -)

Фактически, .* будет соответствовать любому символу (. в регулярном выражении), столько раз, сколько возможно (* в регулярном выражении; относится к предыдущей строке так что . в данном случае).

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

2 голосов
/ 10 марта 2010

. означает совпадение с любым символом, кроме "\ n". * означает «повторить предыдущий символ 0 или более раз». \. соответствует фактическому «.».

Кстати, все это в документах .

1 голос
/ 10 марта 2010

При этом выполняется поиск строки, содержащей ноль или более символов, за которой следует ".pdf".. * - это общая идиома в регулярных выражениях, и это означает совпадение любого символа 0 или более раз. . потому что в регулярных выражениях. имеет особое значение, и \ избегает этого.

0 голосов
/ 11 марта 2010

используйте взамен os.walk () . И нет необходимости использовать регулярные выражения.

for r,d,f in os.walk(path):
    for files in f:
        if files[-4:].lower() == ".pdf":
             print "found pdf: ",os.path.join(r,files)
0 голосов
/ 10 марта 2010

Период (.)
будет соответствовать любому символу кроме новых строк

Следующая звездочка (*)
означает неограниченное количество повторений предыдущего периода

Обратная косая черта ()
избегает периода в .pdf, так что это выглядит для реального период, поэтому ТОЛЬКО. PDF и не "любой символ ".pdf снова"

Итак, в конце концов, он ищет Любой фрагмент текста, который заканчивается на .pdf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...