我有一个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"""
在
您可以在任何支持多行正则表达式搜索和替换的文本编辑器中执行此操作。在
我使用Komodo IDE来测试这一点,因为它包含了一个优秀的正则表达式测试工具(“Rx工具箱”),用于测试正则表达式。我想也有一些类似的在线工具。同一个正则表达式在free Komodo Edit中工作。它还可以在大多数支持Perl兼容正则表达式的编辑器中工作。在
在Komodo中,我使用Replace对话框并选中Regex选项,以找到:
并替换为:
^{pr2}$给定此测试代码:
结果是:
那么我是如何从原始代码中得到正则表达式的呢?在
(
、)
、.
、和{\
的前缀,以转义它们(一种简单的手动搜索和替换)。在real0
的第一个实例替换为(\w+)
。这将匹配并捕获一个字母数字字符字符串。在real0
的其余实例替换为\1
。这与(\w+)
捕获的文本匹配。在\s*\n\s*
。这将匹配行上的任何尾随空格,再加上换行符,再加上下一行的所有前导空格。这样,正则表达式的工作方式与它匹配的代码的嵌套级别无关。在最后,“replace”文本在需要原始捕获文本的地方使用
\1
。在当然,如果您想这样做的话,可以在Python中使用类似的正则表达式。我建议使用
\w
而不是[a-z0-9]
来简化它。另外,不要包含换行符和前导空格;而是使用我使用的\s*\n\s*
方法,而不是多行字符串。这样它将独立于我上面提到的嵌套级别。在相关问题 更多 >
编程相关推荐