Вы можете сделать это в любом текстовом редакторе, который поддерживает многострочный поиск регулярных выражений и заменить.
Я использовал Komodo IDE, чтобы проверить это, потому что он включает в себя отличный тестер регулярных выражений («Rx Toolkit») для экспериментов с регулярными выражениями. Я думаю, что есть и такие онлайн-инструменты, как это. Это же регулярное выражение работает в свободном Komodo Edit. Он также должен работать в большинстве других редакторов, поддерживающих регулярные выражения, совместимые с Perl.
В Комодо, я использовал диалог 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
и заменить его:
\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")
Итак, как я получил это регулярное выражение из вашего исходного кода?
- Приставка все экземпляры
(
, )
, .
и *
с \
, чтобы избежать их (простой ручной поиск и замену).
- Заменить первый экземпляр
real0
с (\w+)
. Это соответствует и фиксирует строку буквенно-цифровых символов.
- Заменить оставшиеся экземпляры
real0
на \1
. Это соответствует тексту, снятому (\w+)
.
- Замените каждую новую строку и ведущее место на следующей строке
\s*\n\s*
. Это соответствует любому конечному пространству на линии, плюс новая строка, плюс все ведущее место на следующей строке. Таким образом, регулярное выражение работает независимо от уровня вложенности соответствующего кода.
И, наконец, текст «заменить» использует \1
, где ему нужен оригинальный захваченный текст.
Конечно, вы можете использовать аналогичное регулярное выражение в Python, если хотите сделать это именно так. Я бы предложил использовать \w
вместо [a-z0-9]
, чтобы сделать его проще. Кроме того, не включайте новые строки и ведущие пробелы; вместо этого используйте подход \s*\n\s*
, который я использовал вместо многострочной строки. Таким образом, он будет независим от уровня гнездования, как я уже упоминал выше.
Вы используете 'vim' в качестве своего редактора? –
Этот вопрос является дубликатом с вопросом: [Как ввести регулярное выражение в string.replace в python?] (Http://stackoverflow.com/questions/5658369/how-to-input-a-regex-in-string -replace-in-python) – perror
_ "где real0 может быть любым именем переменной [a-z0-9] +" _ Вы имеете в виду, где имя переменной _not_ 'real0'? Если это так, и вы должны решить, какую переменную разместить там, вы спрашиваете невозможное ... – Ben