正则表达式意外结束

1 投票
2 回答
11222 浏览
提问于 2025-04-27 22:30

我想从路径中只提取文件名和扩展名:

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'

撰写回答