我想从路径中只获取带扩展名的文件名:
C:\\Users\\anandada\\workspace\\MyTestProject\\src\\OpenTest.c
以下声明,
fileName = re.match("[^\\]*.c$", fileName)
给出错误:
正则表达式意外结束
我正在使用python 3.3.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)
原始字符串格式\\
的被视为预期的字面反斜杠。