2015-08-28 3 views
0

Я читал тысячи сообщений, пытаясь найти лучшее решение. Приносим извинения, если вопрос об этом задан несколько раз.Python regex on multiple src to destination

У меня есть файл, в который я помещал заполнители. Файл имеет 200 строк, и в этом файле есть раздел, где у меня есть propertyNames и соответствующий propertyValues. propertyValues являются заполнителями, которые я хочу найти и заменить фактические значения. Я думаю, что для этого воспользуюсь и re модулями, но я не хочу, чтобы несколько раз анализировать строки за строкой, чтобы заполнить несколько propertyValues. Вместо этого я думал, что было бы более эффективно иметь несколько строк, которые я ищу, и соответствующий текст замены, и при его сканировании по строкам, если он найдет какой-либо экземпляр, который заменяет его соответствующую замену. Что было бы лучшим способом сделать это? Можно ли это сделать простым способом с fileinput и re?

+0

Что вы пытались до сих пор? Почему бы просто не сгенерировать весь файл после того, как у вас есть значения, которые вы хотите вставить, или добавьте вновь созданные значения в конце файла? Знать, какой формат файла вам нужно обрабатывать, поможет многое.Выполнение того, что вы хотите без какого-либо синтаксического анализа, приведет вас к единственному варианту, сгенерируйте файл, когда вы будете готовы ... – Richard

+0

200 строк не так уж плохи. Вы можете определенно уйти, прочитав весь файл в памяти и выполнив всю свою обработку. Кроме того, 're.sub' - это то, что вы, вероятно, ищете. Вместо строки замены вы можете передать обратный вызов 're.sub'. Внутри этого обратного вызова вы можете определить, какое значение заменить заменяемым заполнителем. –

ответ

0

Я бы использовал jinja для этого. Это механизм шаблонов, который позволяет вам делать это и многое другое (например, для циклов внутри шаблонов и т. Д.).

Взгляните: http://jinja.pocoo.org/docs/dev/templates/

Конечно, это будет необходимо изменить формат входного файла. Если вам разрешено это сделать, я думаю, что это путь.

0

Как я понимаю ваш вопрос есть два случая

Первое: Поиск и линии заменить линии

$place_holders=[] 

find_and_replace(): 
    for $line in $file: 
     for $text in $line: 
      if $text == "Target text": 
       $place_holders.add($text.get_place_holder) 

     if place_holders.size != 0: 
      for $place_holder in $place_holders: 
       replace "New text" at position $place_holder 
      $place_holders=[] 

Второе: Искать все строки замените

find_and_replace(): 
    for $line in $file: 
     for $text in $line 
      if $text == "Target text": 
       $place_holders.add($text.get_place_holder) 

if $place_holders.size != 0: 
    for $place_holder in $place_holders: 
     replace "New text" at position $place_holder 
    $place_holders=[] 

В чем разница между кодами выше?

Да, сколько раз вы задаете вопрос «place_holders список пуст или нет?» первый кейс спрашивает file.number_of_line раз в то время второй случай спрашивайте только один раз. Я думаю, что это должно иметь очень небольшое значение для скорости регулярного выражения.

Примечание приведенный выше код является простой демонстрацией scenerio в вашей проблеме, нет гарантии, что двигатель регулярного выражения будет работать таким образом.

НО

Если вы хотите другой способ оптимизировать скорость вашей программы, я предлагаю

  1. ли параллельные вычисления,
  2. Используйте любой движок регулярных выражений, которые обеспечивают JIT компиляцию (В если у вас сложное регулярное выражение).