Python中的RegEx

时间:2010-03-10 17:38:19

标签: python regex

这是一个搜索当前目录中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 个答案:

答案 0 :(得分:8)

它表示任何字符零次或多次,后面是文字点和字母pdf(由于星号的贪婪性质,它基本上保证'.pdf'将在主题的末尾字符串)。

glob模块以正确的方式执行此操作:

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

答案 1 :(得分:3)

  

为什么".*\"

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

事实上,.*会匹配任何字符(正则表达式中为.),尽可能多次*在正则表达式中;与前一个字符串相关,因此在这种情况下为.

另一方面,

\.将恰好匹配一个点(.)。 \转义后续字符(.),因此它不再具有其特殊含义(例如,在这种情况下“匹配任何字符”),但它将被视为-is。

答案 2 :(得分:2)

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

顺便说一下,这都在the docs

答案 3 :(得分:1)

这将搜索包含零个或多个字符后跟“.pdf”的字符串。*是regexp中的常用习语,它表示匹配任何字符0次或更多次。的。是因为在regexps中。具有特殊意义,并且\逃脱了。

答案 4 :(得分:0)

期间(。)
将匹配除换行符之外的任何字符

以下星号(*)
   意味着无限次数的重复    前一期

反斜杠()
逃避.pdf期间所以它寻找一个真实的    期间,所以只有.pdf,而不是“任何    字符“.pdf再次”

所以最后它寻找 任何以.pdf结尾的文本

答案 5 :(得分: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)