gpt4 book ai didi

Python 只替换不是 C++ 注释的字符串

转载 作者:太空宇宙 更新时间:2023-11-04 03:30:09 25 4
gpt4 key购买 nike

我只想处理 NOT C++ 注释的字符串,这里是找出 C++ 注释的模式:

pattern = re.compile(r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"', re.DOTALL | re.MULTILINE)

但是,我不知道如何让它按照我的意图工作。

# Python 3.4.2
s = '''
/****
C++ comments
//pResMgr->CreateDialogEx();
****/
//pResMgr->CreateDialogEx();
/*//pResMgr->CreateDialogEx();*/

// real code, I want to replace only this following line of code
pResMgr->CreateDialogEx();
'''

newS = s.replace('CreateDialogEx', 'Create')
print(newS)

我的预期输出是:

/****
C++ comments
//pResMgr->CreateDialogEx();
****/
//pResMgr->CreateDialogEx();
/*//pResMgr->CreateDialogEx();*/

// real code, I want to replace only this following line of code
pResMgr->Create();

最佳答案

没有测试它,但它适用于您的情况,并且从根本上应该可以工作。它基本上遍历文本查找换行符,//或/*,然后处理案例。非常简单,没有正则表达式。

source_code = '''//pResMgr//->CreateDialogEx();'''

def indexOf(string, character):
return string.index(character) if character in string else 9999999

def replaceNotInComments(string, searchFor, replaceWith):
result = ''
nextBreak = 0
while True:
nextBreak = min(indexOf(string, '\n'),
indexOf(string, '/*'),
indexOf(string, '//'))
if nextBreak == 9999999:
result += string.replace(searchFor, replaceWith);
break
result += string[0:nextBreak].replace(searchFor, replaceWith);

if nextBreak == indexOf(string, '\n'):
string = string[nextBreak+1:]

if nextBreak == indexOf(string, '/*'):
string = string[nextBreak+2:]
result += '/*'+string[0:indexOf(string, '*/')+2]
string = string[indexOf(string, '*/')+2:]

if nextBreak == indexOf(string, '//'):
string = string[nextBreak+2:]
if result != '':
result += '\n'
result += string[0:indexOf(string, '\n')+1]
string = string[indexOf(string, '\n')+1:]


return result

result = replaceNotInComments(source_code, 'CreateDialogEx', 'Create')
print(result)

关于Python 只替换不是 C++ 注释的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31377597/

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