基于my previous question,我意识到我的许多字符串实际上是连接的字符串,这使得用C++原始字符串文字分隔符替换引号变得更加困难.

F.I.我想用引号代替本文中的引号:

text = r'''
docstring = "mystr";

docstring = "some \"subs" + some_str + "next";

docstring = (
  some_str + "cde" + some_str + "efg" + another_str + "ghi"
);
'''

对此

target_text = r'''
docstring = R""""(mystr)"""";

docstring = R""""(some \"subs)"""" + some_str + R""""(next)"""";

docstring =
  some_str + R""""(cde)"""" + some_str + R""""(efg)"""" + another_str + R""""(ghi)"""";
'''

最后一个连接周围的括号被删除,并保留特殊字符,如转义的\".

我目前的方法是以下正则表达式

import re
re.sub(
    r'(?<=[\s])((?:docstring|some_detailed_notes)\s*=\s*(?://.*\n\s*)*)(("|\(\s*")((?:[^"\\]|\\.)+)("|"\s*\)))([\+_a-z ]*)(\s*;)',
    fr'\1{cpp_rawstr_start}\3{cpp_rawstr_end}\5'
    text
)

但这当然不会奏效,原因有两个:

  • 我的正则表达式与组不匹配,除非只有一个串联
  • 组顺序/编号根据要分析的字符串而变化.老实说:完全不知道该如何处理这件事.

我也试过这个regex on regex101,但不能使它工作.

推荐答案

您可以采取两个阶段的方法,使用带有替换函数的re.sub.传递给re.sub的正则表达式匹配单独组中的docstring = 和字符串的其余部分,然后替换函数拆分+的其余部分,并用适当转义的版本替换字符串:

def replacer(m):
    res = m[1]
    strings = re.split(r'(\s*\+\s*)(?=(?:[^"]*"(?:[^\\"]|\\.)*"[^"]*)*$)', m[3])
    for i, s in enumerate(strings):
        if i % 2 or not s.startswith('"'):
            res = res + s
        else:
            res = res + 'R""""(' + s.strip()[1:-1] + ')""""'
    return res + ';'

target_text = re.sub(r'((?:docstring|some_detailed_notes)\s*=\s*)(\(\s*)?((?:"(?:[^\\"]|\\.)*"|[^;])+)(?(2)\s*\)|)\s*;', replacer, text)

对于此输入:

docstring = "mystr()" + abc(some_args) + "other \";str";

docstring = "mystr";

docstring = "some \"subs" + some_str + "next";

docstring = (
  some_str + "cde" + some_str + "efg" + another_str + "ghi"
);
'''

这会产生以下结果:

docstring = R""""(mystr())"""" + abc(some_args) + R""""(other \";str)"""";

docstring = R""""(mystr)"""";

docstring = R""""(some \"subs)"""" + some_str + R""""(next)"""";

docstring = some_str + R""""(cde)"""" + some_str + R""""(efg)"""" + another_str + R""""(ghi)"""";

Python相关问答推荐

如何将不同长度的新列添加到现有的框架中

如何让pyparparsing匹配1天或2天,但1天和2天失败?

code _tkinter. Tcl错误:窗口路径名称错误.!按钮4"

使文本输入中的文本与标签中的文本相同

从包含数字和单词的文件中读取和获取数据集

如何比较numPy数组中的两个图像以获取它们不同的像素

难以在Manim中正确定位对象

处理(潜在)不断增长的任务队列的并行/并行方法

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

如何使用html从excel中提取条件格式规则列表?

为什么符号没有按顺序添加?

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

如何请求使用Python将文件下载到带有登录名的门户网站?

基于索引值的Pandas DataFrame条件填充

如何在UserSerializer中添加显式字段?

当点击tkinter菜单而不是菜单选项时,如何执行命令?

CommandeError:模块numba没有属性generated_jit''''

如何在BeautifulSoup/CSS Select 器中处理regex?

当条件满足时停止ODE集成?

使用字典或列表的值组合