错误:将re.findall与通配符一起使用时,假冒逸出行尾

问题描述

我正在尝试使用re.findall创建文件路径的子字符串,该子字符串仅给我第一个反斜杠之前的部分。 这是os.walk的for循环的一部分,由于re.findall,我正在尝试获取根目录的第一部分。

folder="Q:\\test\\test.gdb"
for root,dirs,files in os.walk(folder):
   Quelle=re.findall('(.+?)\\',root)

但是,这会产生错误:假冒逸出(行尾)。据我了解,之所以会产生此错误,是因为我在行尾使用了转义字符。但是,在我的代码示例中,它不是在行尾吗?根据我的理解,我必须使用它来转义反斜杠,以便我的字符串包括直到第一个反斜杠为止的所有路径。有什么办法解决吗? 当我使用

folder="Q:\\test\\test.gdb"
for root,files in os.walk(folder):
   Quelle=re.findall('(.+?):',root)

我正确获取了字符串['Q']的列表。但是我想在字符串中包含:

解决方法

错误来自re,而不是解释程序。

反斜杠在正则表达式中也具有转义符的含义。例如,r'\.'是一个字面量,而不是像'.'那样代表所有字符的类。因此,需要在正则表达式级别再次再次对文字反斜杠进行转义。

您必须继续前进:

  1. 将反斜杠加倍:'(.+?)\\\\'
  2. 执行相同的操作,但是使用原始字符串使其看起来更好:r'(.+?)\\'

不要难过。官方教程中甚至有一个专门的章节称为"The Backslash Plague",专门处理这种情况。

您还可以在official docs中搜索特殊字符列表以获取更多信息。