2010-03-10 16 views
0

这是一个搜索当前目录中PDF文件的示例。Python中的RegExp

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"是什么意思?

为什么".*\"

谢谢!

回答

3

为什么".*\"

错误的问题,你错过了表达的关键字符。 ;-)

事实上,.*将匹配任何字符(.在正则表达式),尽可能多次(*在正则表达式;在这种情况下,涉及以前的字符串,所以.)。

\.另一方面,将恰好匹配一个点(.)。 \转义为下列字符(.),因此它不再具有其特殊含义(例如,在本例中“匹配任何字符”),而是将其视为原样。

+0

摆脱正则表达式感谢您的解释!还要感谢SilentGhost,但我只能选择一个答案。 :) – nonamelive 2010-03-10 18:02:48

8

这意味着任何字符零次或多次,其后跟随字面点和字母pdf(由于星号的贪婪本质,基本保证'.pdf'将在主题字符串的末尾)。

glob模块做到这一点的正确方法:

>>> glob.glob(os.path.join(dirname, '*.pdf')) 
+1

或者至少用'path.endswith('。pdf')' – prestomation 2010-03-10 17:46:18

2

.手段匹配任何字符,但 “\ n”。 *表示“重复以前的字符0次或更多次”。 \.与实际的“。”匹配。

顺便说一句,这全是在the docs

1

这将搜索包含零个或多个字符的字符串,后跟“.pdf”。*是正则表达式中的常用成语,它表示任何字符匹配0或更多次。这个。是因为在regexps中。有一个特殊的含义,并且\逃避那。

0

的句号(。)
将匹配除了换行符

以下星号(*)的任何字符
意味着重复的无限数量的前一时期

反斜线的 ()
在.pdf中跳过了句点所以它寻找一个真实的 期间,所以只有.pdf而不是“任何 字符”。再次PDF

那么到底它看起来 任何一块以.pdf

0

使用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)