Python 如何多次替换字符串?
我有一个10000行的源代码与吨的重复。所以我把文件读成文本 例如:Python 如何多次替换字符串?,python,regex,Python,Regex,我有一个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_GE
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
其中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""" PATH=“func.pyx” source_string=open(路径“r”).read() 图案=r“” 断言PyArray\u TYPE\([a-z0-9]+)\==np.NPY\u DOUBLE,“([a-z0-9]+)不是DOUBLE” 断言([a-z0-9]+)。ndim==1,“([a-z0-9]+)具有错误的尺寸” 如果不是(PyArray_标志([a-z0-9]+)&np.NPY_C_连续): ([a-z0-9]+)=PyArray_getcontinuous([a-z0-9]+) ([a-z0-9]+)U数据=([a-z0-9]+)。数据“”
您可以在任何支持多行正则表达式搜索和替换的文本编辑器中执行此操作 我曾经对此进行过测试,因为它包括一个优秀的正则表达式测试工具(“Rx工具包”),用于测试正则表达式。我想也有类似的在线工具。同样的正则表达式在自由空间中工作。它还应该在大多数其他支持Perl兼容正则表达式的编辑器中工作 在Komodo中,我使用选中Regex选项的Replace对话框来查找:
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
给定此测试代码:
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
的第一个实例替换为(\w+
)。这将匹配并捕获一个字母数字字符字符串real0
的其余实例替换为\1
。这与(\w+)
捕获的文本相匹配\s*\n\s*
替换每一个换行符和下一行的前导空格。这与行上的任何尾随空格、换行符以及下一行的所有前导空格相匹配。这样,无论正则表达式匹配的代码的嵌套级别如何,它都可以工作\1
如果您想这样做,当然可以在Python中使用类似的正则表达式。我建议使用
\w
而不是[a-z0-9]
,只是为了更简单。另外,不要包括换行符和前导空格;使用我使用的\s*\n\s*
方法代替多行字符串。这样,它将独立于我上面提到的嵌套级别。您是否使用vim
作为您的编辑器?这个问题与以下问题重复:“real0可以是任何变量名[a-z0-9]+”您的意思是变量名不是real0
?如果是这样的话,你必须决定把什么变量放在那里,你是在问不可能的事…@perror不,不是。这是一个更复杂的问题,因为你在中间有一个通配符,你必须检测和记住。@ siaMII-你能使它有点模糊,你想匹配什么模式,你想用它替换什么?现在一点也不清楚。您想用一行函数调用来替换整个代码块吗?这看起来不错,但是可以在python中或在线上完成吗。我宁愿不安装另一个IDE。我将Eclipse与PydevYes一起使用,我添加了一些关于使用Python进行此操作的建议。您可能也可以直接在Eclipse中完成这项工作。作为一般性说明,我建议您不要将自己局限于单个编辑器或IDE。科莫多编辑是免费的;使用它不需要任何费用。其他几个好的文本编辑器也是如此。我发现有一个以上的编辑器是非常有帮助的;如果一个人不擅长某项任务,我可以很容易地切换到另一个人来完成该任务。例如,我的大部分工作都使用Komodo IDE,但它不能很好地处理超大文件。因此,我使用了其他编辑器(如UltraEdit)来处理非常大的文件。我更新了答案以更正一件事:我忘记了可以在正则表达式(而不仅仅是替换字符串)中使用\1
来匹配第一个(\w+
组。这解决了我提到的问题,它没有检查所有realN
字符串是否具有与realN
相同的值。
\1_data = _get_data(\1, "\1")
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")