意外结束正则表达式

时间:2014-10-16 12:06:54

标签: python regex python-3.3

我想从路径中只获取带扩展名的文件名:

C:\\Users\\anandada\\workspace\\MyTestProject\\src\\OpenTest.c

以下声明,

fileName = re.match("[^\\]*.c$", fileName)

给出错误:

  

正则表达式意外结束

我正在使用python 3.3.2

2 个答案:

答案 0 :(得分:5)

你需要双重双重转义再次使用原始字符串代替:

fileName = re.match("[^\\\\]*.c$",fileName)

fileName = re.match(r"[^\\]*.c$",fileName)

否则先是Python,然后正则表达式编译器将解释这些反斜杠,导致]被转义:

>>> print("[^\\]*.c$")
'[^\]*.c$'

另请参阅Python Regex HOWTO的Blackslash Plague section

接下来,您需要注意re.match 锚定到字符串的开头。你可能想在这里使用re.search()。请参阅match() vs. search() section

  

match()函数仅检查RE在字符串开头是否匹配,而search()将向前扫描字符串以进行匹配。记住这一区别非常重要。

您可能还希望转义.部分中的.c; .匹配任何字符,因此foobaric也匹配; i将满足.模式。

re.match()re.search()函数返回match object,而不是字符串的匹配部分。您必须明确提取该部分:

fileName = re.search(r'[^\\]*\.c$', fileName).group()

演示:

>>> import re
>>> fileName = 'C:\\Users\\anandada\\workspace\\MyTestProject\\src\\OpenTest.c'
>>> re.search(r'[^\\]*\.c$', fileName).group()
'OpenTest.c'

答案 1 :(得分:1)

这是因为你没有使用原始字符串。双反斜杠被解释为关闭方括号的转义。你需要写:

fileName = re.match(r"[^\\]*.c$", fileName)
原始字符串格式\\

被视为预期的字面反斜杠。