gpt4 book ai didi

Python re.sub() 函数将文件路径中的 "\t"转换为制表符

转载 作者:行者123 更新时间:2023-12-01 01:48:33 26 4
gpt4 key购买 nike

我正在尝试使用 python 脚本获取已编写的 cpp 文件并将头文件添加到包含列表中。目前,我创建了一个包含我想要添加的所有包含内容的字符串,然后使用 re 模块将其中的包含内容替换为我的字符串。所有包含的名称中都有一个“\t”,这会导致问题;我没有按预期打印该行(#include "abc\type\GenericTypeMT.h),而是得到#include "abc ype\GenericTypeMT.h。当我将字符串打印到控制台时,它具有预期的形式,这让我相信这是一个 re.sub 问题,而不是写入文件的问题。下面是代码。

import re
import string

INCLUDE = "#include \"abc\\type\\"

with open("file.h", "r+") as f:
a = ""
b = ""
for line in file:
a = a + line
f.seek(0,0)
types = open("types.txt", "r+")
for t in types:
head = INCLUDE + t.strip() + "MT.h"
b = b + head + "\n"
a = re.sub(r'#include "abc\\type\\GenericTypeMT\.h"', b, a)
types.close()
print b
print a
f.write(a)

b 的输出是:

#include "abc\type\GenericTypeMT.h"
#include "abc\type\ServiceTypeMT.h"
#include "abc\type\AnotherTypeMT.h"

a 的(截断的)输出是:

/* INCLUDES *********************************/
#include "abc ype\GenericTypeMT.h"
#include "abc ype\ServiceTypeMT.h"
#include "abc ype\AnotherTypeMT.h"

#include <map>
...

我能找到的最接近我的问题的是 How to write \t to file using Python ,但这与我的问题不同,因为我的问题似乎源于正则表达式完成的替换,如写入之前的打印所示。

最佳答案

re.sub() 函数也会扩展替换字符串中的元字符(转义序列)。替换字符串中的 \t 字符序列(由两个字符 \t 组成)由 解释re 模块,作为制表符的转义序列:

>>> import re
>>> re.sub(r'^.', '\\t', 'foo')
'\too'
>>> print(re.sub(r'^.', '\\t', 'foo'))
oo

但是如果您使用函数作为替换值,则不会发生此类扩展。请注意,这包括不处理占位符,您必须使用传递到函数中的匹配对象来创建您自己的占位符插入逻辑。

您的代码中没有任何占位符,因此用于创建函数的 lambda 就足够了:

a = re.sub(r'#include "abc\\type\\GenericTypeMT\.h"', lambda m: b, a)

对之前的同一个设计的 foo 示例字符串进行演示:

>>> re.sub(r'^.', lambda m: '\\t', 'foo')
'\\too'
>>> print(re.sub(r'^.', lambda m: '\\t', 'foo'))
\too

re.escape() function不幸的是,过于贪婪地向更多字符添加 \ 反斜杠而不仅仅是替换元字符;你最终会得到比开始时更多的反斜杠。

请注意,由于您在替换中实际上并未进行任何模式匹配,因此您也可以只使用 str.replace()完成这项工作:

a = a.replace(r'#include "abc\type\GenericTypeMT.h"', b)

\. 字符不再是正则表达式中的元字符,因此它们也不需要转义。

关于Python re.sub() 函数将文件路径中的 "\t"转换为制表符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50975948/

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