gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:59:15 24 4
gpt4 key购买 nike

我有一个带有 python doctest 的函数,该函数失败了,因为测试输入字符串之一有一个反斜杠,即使我已将该字符串编码为原始字符串,该反斜杠也被视为转义字符。

我的文档测试如下所示:

>>> 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']

该函数旨在根据待办事项规范的一些变化从单行中提取待办事项文本,如下所示:

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

并且,以防万一 doctest 实现使用 stdout(我没有检查过,抱歉):

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

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

编辑:根据 Alex Martellis 的回答,我想了解什么正则表达式实际匹配该死的r"""//\todo fix me""" 。我知道我最初并没有要求别人做我的作业,我会接受亚历克斯的回答,因为它确实回答了我的问题(或证实了我的恐惧)。但我保证在这里对解决我的问题的任何好的解决方案表示支持:)

编辑:仅供引用,kodos 项目已提交一个错误:bug #437633

我使用的是 Python 2.6.4(r264:75706,2009 年 12 月 7 日,18:45:15)

感谢您阅读本文(如果您直接跳到这里,我理解)

最佳答案

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

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

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

您的原始字符串是:

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

所以斜杠和'todo'之间有一个反斜杠,因此正则表达式当然不匹配它。它不能——在该正则表达式中,您没有表达任何选择性匹配文字反斜杠的愿望。

编辑:RE 模式与您的非常接近, 接受并忽略 't' 之前的可选反斜杠:

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

请注意,在本例中,反斜杠确实必须重复,以“转义自身”。

关于python - 传递带有(意外)转义字符的字符串会丢失字符,即使它是原始字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2580654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com