Регулярное выражение Python заменяет числа <100 на «100 BLOCK», в противном случае последние две цифры заменяются на «BLOCK» - PullRequest
1 голос
/ 25 июня 2019

Я использую Python 2.7.13 для очистки некоторых данных.

У меня есть список чисел, если строки начинаются с цифр. Если начальный номер меньше 100, мне нужно заменить его на '100 BLOCK'. Если число больше, мне нужно заменить последние две цифры на '00 BLOCK'.

Список текста гарантированно начинается с цифры 0 или больше.

Пример

'1234 foo foo' --> '1200 BLOCK FOO FOO'
'19 bar bar' --> '100 BLOCK bar bar'
'0 baz baz' --> '100 BLOCK baz baz'

В настоящее время я запускаю два различных выражения регулярного выражения в цикле for:

for row in listOfNumbers:
    /* Replace last two digits with '00 BLOCK' */
    firstRegex = re.sub(r'^(\d*)\d{2}\b', r'\g<1>00 BLOCK', row)

    /* Replace digits under 100 with '100 BLOCK'. This includes 0 */
    secondRegex = re.sub(r'^(\d{1,2})\b', '100 BLOCK', firstRegex)

    /* Do other stuff with results

Можно ли как-то сделать это в одном регулярном выражении?

1 Ответ

1 голос
/ 25 июня 2019

Вы можете использовать

import re
strs = ['1234 foo foo', '19 bar bar', '0 baz baz']
rx = re.compile(r'^(?:(\d{1,2})|(\d+)\d{2})(?!\d)')
for s in strs:
    print(rx.sub(lambda x: '100' if x.group(1) else x.group(2)+"00", s))

Вывод:

1200 foo foo
100 bar bar
100 baz baz

См. Python demo

Соответствует регулярному выражению:

  • ^ - начало строки
  • (?:(\d{1,2})|(\d+)\d{2}) - группа без захвата, соответствующая 2 альтернативам:
    • (\d{1,2}) - группа 1: одна или две цифры (<100) </li>
    • | - или
    • (\d+)\d{2} - группа 2 захватывает одну или несколько цифр, а затем любые 2 цифры
  • (?!\d) -никакие цифры справа не допускаются.

Если для сопоставления используется сопоставленная группа 1 100, в противном случае возвращается содержимое группы 2 с добавленным к ней 00.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...