2016-07-24 1 views
1

Я использую Notepad ++ (версия 6.9.2)Использование Блокнота, можно ли удалить пробелы во время поиска и замены регулярных выражений при использовании обратного трассировки?

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

Пример файла:

0001168500Mel  Maenyey Legal College                  91PO Box 867                       Lutghjhe           403003Jellisa Moneyey            07 3660 2551  07 3660 2211  [email protected]             

Вот мой текущий 'найти' регулярное выражение:

^(.{10})(.{100})(.{2})(.{50})(.{50})(.{50})(.{4})(.{2})(.{60})(.{20})(.{20})(.{80}) 

и вот мой 'заменить' регулярное выражение:

"$1","$2","$3","$4","$5","$6","$7","$8","$9","$10","$11","$12" 

Они работают хорошо однако я хотел бы:

  1. не копировать пробелы (справа или слева)
  2. Удалить левый '0' (нули) из числовых значений - нет в этом примере файла, но есть некоторые в других файлах.

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

+2

Это проще, если вы делаете это в несколько этапов. После того, как вы применили регулярное выражение, которое вы имеете, и все четко разделено запятыми, вы можете просто заменить '" [0] + | + "' на '' ' –

+0

. Я думаю, вы можете легко добавить эту пост-обработку в сценарий Python. Если вас это интересует, я буду «готовить», когда у меня будет запасная минута. –

ответ

0

Ваших текущие выходы регулярных выражений этот выход:

"0001168500","Mel  Maenyey Legal College                  ","91","PO Box 867          ","             ","Lutghjhe           ","4030","03","Jellisa Moneyey            ","07 3660 2551  ","07 3660 2211  ","[email protected]             " 

Проблема с регулярными выражениями подхода заключается в том, что у вас есть поля фиксированной ширины, а число возможных ведущих нулей и ведущих/конечных пробелов является переменной. Хотя в некоторых случаях это может помочь с притяжательным сопоставлением и lookbehinds, я бы рекомендовал использовать более гибкий подход на основе кода.

Install the working PythonScript version и создать файл сценария со следующим содержимым:

import re 
def repl(match): 
    return '"{0}","{1}","{2}","{3}","{4}","{5}","{6}","{7}","{8}","{9}","{10}","{11}"'.format(
     digit_reg.sub(r'\1', match.group(1).strip()), 
     digit_reg.sub(r'\1', match.group(2).strip()), 
     digit_reg.sub(r'\1', match.group(3).strip()), 
     digit_reg.sub(r'\1', match.group(4).strip()), 
     digit_reg.sub(r'\1', match.group(5).strip()), 
     digit_reg.sub(r'\1', match.group(6).strip()), 
     digit_reg.sub(r'\1', match.group(7).strip()), 
     digit_reg.sub(r'\1', match.group(8).strip()), 
     digit_reg.sub(r'\1', match.group(9).strip()), 
     digit_reg.sub(r'\1', match.group(10).strip()), 
     digit_reg.sub(r'\1', match.group(11).strip()), 
     digit_reg.sub(r'\1', match.group(12).strip()) 
    ) 

pat = r'^(.{10})(.{100})(.{2})(.{50})(.{50})(.{50})(.{4})(.{2})(.{60})(.{20})(.{20})(.{80})' 
digit_reg = re.compile(r'^0+([0-9]*)$') 
editor.rereplace(pat, repl) 

Узор вы должны использоваться для сопоставления отдельных полей. Объект данных сопоставления будет передан методу repl, где каждое из полей будет обрезано с помощью метода .strip() из верхнего/конечного пробелов, а регулярное выражение ^0+([0-9]*)$ будет применено ко всем полям для удаления начальных нулей в строках, которые состоят только из цифр.

enter image description here

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