【问题标题】:unexpected end of regular expression正则表达式意外结束
【发布时间】: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


    【解决方案1】:

    您需要加倍将加倍的转义符再次改用原始字符串:

    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
    【解决方案2】:

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

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

    原始字符串格式 \\ 被视为预期的文字反斜杠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多