如何多次替换字符串?

2024-07-01 07:38:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个10000行的源代码与吨的重复。所以我把文件当作文本来读。在

示例:

    assert PyArray_TYPE(real0) == np.NPY_DOUBLE, "real0 is not double"
    assert real0.ndim == 1, "real0 has wrong dimensions"
    if not (PyArray_FLAGS(real0) & np.NPY_C_CONTIGUOUS):
        real0 = PyArray_GETCONTIGUOUS(real0)
    real0_data = <double*>real0.data

我想用

^{pr2}$

其中real0可以是任何变量名[a-z0-9]+


所以不要被源代码搞糊涂了。代码不重要,这是文本处理和正则表达式。在

到目前为止,我得到的是:

    PATH = "func.pyx"
    source_string = open(PATH,"r").read()

    pattern = r"""
    assert PyArray_TYPE\(([a-z0-9]+)\) == np.NPY_DOUBLE, "([a-z0-9]+) is not double"
    assert ([a-z0-9]+).ndim == 1, "([a-z0-9]+) has wrong dimensions"
    if not (PyArray_FLAGS(([a-z0-9]+)) & np.NPY_C_CONTIGUOUS):
       ([a-z0-9]+) = PyArray_GETCONTIGUOUS(([a-z0-9]+))
    ([a-z0-9]+)_data = ([a-z0-9]+).data"""


Tags: data源代码istypenpnotasserthas
1条回答
网友
1楼 · 发布于 2024-07-01 07:38:46

您可以在任何支持多行正则表达式搜索和替换的文本编辑器中执行此操作。在

我使用Komodo IDE来测试这一点,因为它包含了一个优秀的正则表达式测试工具(“Rx工具箱”),用于测试正则表达式。我想也有一些类似的在线工具。同一个正则表达式在free Komodo Edit中工作。它还可以在大多数支持Perl兼容正则表达式的编辑器中工作。在

在Komodo中,我使用Replace对话框并选中Regex选项,以找到:

assert PyArray_TYPE\((\w+)\) == np\.NPY_DOUBLE, "\1 is not double"\s*\n\s*assert \1\.ndim == 1, "\1 has wrong dimensions"\s*\n\s*if not \(PyArray_FLAGS\(\1\) & np\.NPY_C_CONTIGUOUS\):\s*\n\s*\1 = PyArray_GETCONTIGUOUS\(\1\)\s*\n\s*\1_data = <double\*>\1\.data

并替换为:

^{pr2}$

给定此测试代码:

    assert PyArray_TYPE(real0) == np.NPY_DOUBLE, "real0 is not double"
    assert real0.ndim == 1, "real0 has wrong dimensions"
    if not (PyArray_FLAGS(real0) & np.NPY_C_CONTIGUOUS):
        real0 = PyArray_GETCONTIGUOUS(real0)
    real0_data = <double*>real0.data

    assert PyArray_TYPE(real1) == np.NPY_DOUBLE, "real1 is not double"
    assert real1.ndim == 1, "real1 has wrong dimensions"
    if not (PyArray_FLAGS(real1) & np.NPY_C_CONTIGUOUS):
        real1 = PyArray_GETCONTIGUOUS(real1)
    real1_data = <double*>real1.data

    assert PyArray_TYPE(real2) == np.NPY_DOUBLE, "real2 is not double"
    assert real2.ndim == 1, "real2 has wrong dimensions"
    if not (PyArray_FLAGS(real2) & np.NPY_C_CONTIGUOUS):
        real2 = PyArray_GETCONTIGUOUS(real2)
    real2_data = <double*>real2.data

结果是:

    real0_data = _get_data(real0, "real0")

    real1_data = _get_data(real1, "real1")

    real2_data = _get_data(real2, "real2")

那么我是如何从原始代码中得到正则表达式的呢?在

  1. ().、和{}的所有实例加上\的前缀,以转义它们(一种简单的手动搜索和替换)。在
  2. real0的第一个实例替换为(\w+)。这将匹配并捕获一个字母数字字符字符串。在
  3. real0的其余实例替换为\1。这与(\w+)捕获的文本匹配。在
  4. 将每个换行符和下一行的前导空格替换为\s*\n\s*。这将匹配行上的任何尾随空格,再加上换行符,再加上下一行的所有前导空格。这样,正则表达式的工作方式与它匹配的代码的嵌套级别无关。在

最后,“replace”文本在需要原始捕获文本的地方使用\1。在

当然,如果您想这样做的话,可以在Python中使用类似的正则表达式。我建议使用\w而不是[a-z0-9]来简化它。另外,不要包含换行符和前导空格;而是使用我使用的\s*\n\s*方法,而不是多行字符串。这样它将独立于我上面提到的嵌套级别。在

相关问题 更多 >

    热门问题