2013-04-18 5 views
0

У меня есть 10 000 строк исходного кода с тоннами дублирования. Поэтому я читаю в файле как текст.Как заменить строку несколько раз?

Пример:

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_data = _get_data(real0, "real0") 

, где real0 может быть любое имя переменной [а-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""" 

+0

Вы используете 'vim' в качестве своего редактора? –

+0

Этот вопрос является дубликатом с вопросом: [Как ввести регулярное выражение в string.replace в python?] (Http://stackoverflow.com/questions/5658369/how-to-input-a-regex-in-string -replace-in-python) – perror

+0

_ "где real0 может быть любым именем переменной [a-z0-9] +" _ Вы имеете в виду, где имя переменной _not_ 'real0'? Если это так, и вы должны решить, какую переменную разместить там, вы спрашиваете невозможное ... – Ben

ответ

1

Вы можете сделать это в любом текстовом редакторе, который поддерживает многострочный поиск регулярных выражений и заменить.

Я использовал 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") 

Итак, как я получил это регулярное выражение из вашего исходного кода?

  1. Приставка все экземпляры (, ), . и * с \, чтобы избежать их (простой ручной поиск и замену).
  2. Заменить первый экземпляр real0 с (\w+). Это соответствует и фиксирует строку буквенно-цифровых символов.
  3. Заменить оставшиеся экземпляры real0 на \1. Это соответствует тексту, снятому (\w+).
  4. Замените каждую новую строку и ведущее место на следующей строке \s*\n\s*. Это соответствует любому конечному пространству на линии, плюс новая строка, плюс все ведущее место на следующей строке. Таким образом, регулярное выражение работает независимо от уровня вложенности соответствующего кода.

И, наконец, текст «заменить» использует \1, где ему нужен оригинальный захваченный текст.

Конечно, вы можете использовать аналогичное регулярное выражение в Python, если хотите сделать это именно так. Я бы предложил использовать \w вместо [a-z0-9], чтобы сделать его проще. Кроме того, не включайте новые строки и ведущие пробелы; вместо этого используйте подход \s*\n\s*, который я использовал вместо многострочной строки. Таким образом, он будет независим от уровня гнездования, как я уже упоминал выше.

+0

Это выглядит хорошо, но возможно ли это сделать в python или в Интернете. Я бы предпочел не устанавливать еще одну среду IDE. Я использую Eclipse с Pydev – siamii

+0

Да, я добавил несколько предложений для этого с Python. Вы, вероятно, можете сделать это прямо в Eclipse. –

+0

И, как правило, я рекомендую не ограничивать себя ни одним редактором, ни IDE. Комодо Редактировать бесплатно; вам не нужно ничего использовать. Так же есть несколько других хороших текстовых редакторов. Мне очень полезно иметь более одного редактора; если кто-то плохо справляется с конкретной задачей, я могу легко переключиться на другую для этой задачи. Например, я использую Komodo IDE для большей части своей работы, но он не очень хорошо обрабатывает чрезвычайно большие файлы. Поэтому я использую другие редакторы, такие как UltraEdit для очень больших файлов. –

Смежные вопросы