正则表达式意外结束
我想从路径中只提取文件名和扩展名:
C:\\Users\\anandada\\workspace\\MyTestProject\\src\\OpenTest.c
下面这条语句,
fileName = re.match("[^\\]*.c$", fileName)
会出现错误:
正则表达式意外结束
我使用的是 Python 3.3.2
2 个回答
1
这是因为你没有使用原始字符串。双反斜杠被当作是结束方括号的转义符。你需要这样写:
fileName = re.match(r"[^\\]*.c$", fileName)
使用原始字符串格式时,\\
会被视为一个普通的反斜杠,正如你所期望的那样。
5
你需要把已经加倍的转义符再加倍一次,或者直接使用原始字符串:
fileName = re.match("[^\\\\]*.c$",fileName)
或者
fileName = re.match(r"[^\\]*.c$",fileName)
否则,首先是 Python,然后是正则表达式编译器会解释那些反斜杠,这样就会导致 ]
被转义:
>>> print("[^\\]*.c$")
'[^\]*.c$'
你还可以查看 Python 正则表达式教程中的 反斜杠问题部分。
接下来,你需要知道 re.match
是从字符串的开始位置进行匹配的。这里你可能更想用 re.search()
。可以查看 match()
和 search()
的区别:
match()
函数只检查正则表达式是否匹配字符串的开头,而search()
会在整个字符串中查找匹配。记住这个区别很重要。
你可能还想对 .c
中的 .
进行转义;因为 .
可以匹配任何字符,所以 foobaric
也会匹配;i
会满足 .
的模式。
re.match()
和 re.search()
函数返回的是一个 匹配对象,而不是匹配到的字符串部分。你需要明确地提取那部分内容:
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'