代码之家  ›  专栏  ›  技术社区  ›  Steen

传递带有(意外)转义字符的字符串会丢失字符,即使它是原始字符串

  •  1
  • Steen  · 技术社区  · 14 年前

    >>> infile = [ "Todo:        fix me", "/** todo: fix", "* me", "*/", r"""//\todo      stuff to fix""", "TODO fix me too", "toDo bug 4663" ]
    >>> find_todos( infile )
    ['fix me', 'fix', 'stuff to fix', 'fix me too', 'bug 4663']
    

    该函数的目的是从一行中提取todo文本,该行遵循todo规范的一些变化,如下所示:

    todos = list()
    for line in infile:
        print line
        if todo_match_obj.search( line ):
            todos.append( todo_match_obj.search( line ).group( 'todo' ) )
    

    正则表达式称为 todo_match_obj

    r"""(?:/{0,2}\**\s?todo):?\s*(?P<todo>.+)"""
    

    与我的ipython shell进行快速对话,我会发现:

    In [35]: print "//\todo"
    //      odo
    
    In [36]: print r"""//\todo"""
    //\todo
    

    In [37]: sys.stdout.write( r"""//\todo""" )
    //\todo
    

    我的regex foo以任何标准来说都不高,我意识到我可能在这里遗漏了一些东西。

    编辑:下面是alexmartellis的答案,我想知道正则表达式是什么 实际上是匹配的爆炸 r"""//\todo fix me""" . 我知道我最初并没有要求别人帮我做作业,我会接受亚历克斯的回答,因为它确实回答了我的问题(或者证实了我的恐惧)。但我保证在这里投票表决任何解决我问题的好办法:)

    bug #437633

    我正在使用python2.6.4(r264:757062009年12月7日,18:45:15)

    感谢您阅读本文(如果您直接跳过此处,我理解)

    2 回复  |  直到 14 年前
        1
  •  2
  •   Alex Martelli    14 年前

    仔细阅读原始正则表达式:

    r"""(?:/{0,2}\**\s?todo):?\s*(?P<todo>.+)"""
    

    它匹配:0到两个斜杠,然后是0+星,然后是0或1个“空白字符”(空格、制表符等),然后是文字字符 'todo'

    您的字符串是:

    r"""//\todo      stuff to fix"""
    

    所以在斜杠和 '待办事项' ,因此正则表达式当然与它不匹配。它不能——在正则表达式中,没有任何地方表示希望有选择地匹配一个反斜杠。

    : 't' 可能是:

    r"""(?:/{0,2}\**\s?\\?todo):?\s*(?P<todo>.+)"""
    

    在这种情况下,必须重复一遍,才能“逃避自己”。

        2
  •  1
  •   Steen    14 年前

    当我冒险走上博士的道路时,这变得更加奇怪。

    python script .

    如果您取消对第22行和第23行的注释,那么脚本将很好地传递,因为方法返回 True ,它既被断言又被显式比较。

    但如果按链接中的文件运行,doctest将失败,并显示以下消息:

    % python doctest_test.py                                                                                                          
    **********************************************************************
    File "doctest_test.py", line 3, in __main__.doctest_test
    Failed example:
        doctest_test( r"""//    odo""" )
    Exception raised:
        Traceback (most recent call last):
          File "/usr/lib/python2.6/doctest.py", line 1241, in __run
            compileflags, 1) in test.globs
          File "<doctest __main__.doctest_test[0]>", line 1, in <module>
            doctest_test( r"""//    odo""" )
          File "doctest_test.py", line 14, in doctest_test
            assert input_string == compare_string
        AssertionError
    **********************************************************************
    1 items had failures:
       1 of   1 in __main__.doctest_test
    ***Test Failed*** 1 failures.
    

    我仍然在使用python2.6.4来实现这个。

    我把这个答案放在“社区维基”下,因为它确实与这个问题无关。