Как я могу использовать регулярное выражение для замены различного числа нулей на одинаковое количество пробелов? - PullRequest
1 голос
/ 09 марта 2012

Я работаю с полевыми данными фиксированной длины, и мне нужно сократить десятичные разряды серии чисел до двух десятичных разрядов. Это не что иное, как нули после десятичной дроби, поэтому достаточно легко написать регулярное выражение, которое сработает на нем. Проблема в том, что мне нужно заменить лишние нули пробелами. Я знаю, что могу сохранить подвыражение и вспомнить его при замене, но есть ли способ подсчитать количество удаленных нулей и вспомнить это? Я просто использую регулярное выражение в окне замены Notepad ++.

Ответы [ 3 ]

1 голос
/ 09 марта 2012

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

Разве мы все не желали этого в тот или иной момент :)1005 *

Единственный способ найти то, что вам нужно, - это использовать библиотеку регулярных выражений Python, которая позволяет указывать функцию для замены вместо строки замены.Таким образом, вы можете сделать этот вызов на каждой строке в вашем файле:

re.sub(search_string, replace_func, line)

Вот как вы могли бы использовать его:

import re
search_string = r'(\.0{2})(0+)'
# this function is called for each match, and returns the replace string
def replace_func(match):
    num_zeroes = len(match.group(2))
    if num_zeroes:
        return match.group(1) + num_zeroes * ' '
    else:
       return ''

for line in ('1234.0', '1234.00', '1234.000', '1234.0000'):
    print re.sub(search_string, zero_replacer, line)

К сожалению, это не поможет вам для Notepad ++,но если вам интересно, я мог бы написать более полный скрипт на python, который прочитал бы ваш файл и выполнил бы всю работу.

1 голос
/ 09 марта 2012

Я нашел кое-что, что работает здесь.

строка поиска: ([.]00[ ]*)0

заменить строку: \1 (после 1 пробел)

То, что это делает, находит .00, сопровождаемый любым количеством пробелов, сопровождаемых нулем.Затем он заменяет это на .00 и пробелы, а затем пробел.Каждый раз, когда он запускается, он заменяет еще один из дополнительных нулей пробелом.Это работает, но может ли кто-нибудь придумать что-то, что нужно запустить только один раз?В этом случае это сработало, но у меня были другие случаи, когда я хотел, чтобы регулярное выражение могло рассчитывать.

0 голосов
/ 09 марта 2012

вам нужно запустить это в цикле, чтобы правильно использовать обратные ссылки:

var data = "7.00000000000 5.00000000 8.0 9.000000000000000000000";
var re = /(\.0{0,2})(0*)/;
alert(data.replace(re, RegExp.$1 +RegExp.$2.replace(/0/, 'x')));

edit: первый ответ свернут, а это не то, что хотел OP.

...