【发布时间】:2014-10-16 12:06:54
【问题描述】:
我只想从路径中获取带扩展名的文件名:
C:\\Users\\anandada\\workspace\\MyTestProject\\src\\OpenTest.c
下面的声明,
fileName = re.match("[^\\]*.c$", fileName)
给出错误:
正则表达式意外结束
我正在使用 python 3.3.2
【问题讨论】:
标签: python regex python-3.3
我只想从路径中获取带扩展名的文件名:
C:\\Users\\anandada\\workspace\\MyTestProject\\src\\OpenTest.c
下面的声明,
fileName = re.match("[^\\]*.c$", fileName)
给出错误:
正则表达式意外结束
我正在使用 python 3.3.2
【问题讨论】:
标签: python regex python-3.3
您需要加倍将加倍的转义符再次,或改用原始字符串:
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'
【讨论】:
[^\]*.c$ 不是有效的正则表达式模式,因为 ] 被转义并且构造 [ 不平衡。
OpenTest.c
这是因为您不使用原始字符串。双反斜杠被解释为右方括号的转义。你需要写:
fileName = re.match(r"[^\\]*.c$", fileName)
原始字符串格式 \\ 被视为预期的文字反斜杠。
【讨论】: