Регулярное выражение: добавить пробел после числа, когда следует буква - PullRequest
2 голосов
/ 14 января 2020

После набора чисел я хотел бы добавить пробел в строку. Например, следующие строки должны добавлять пробел после числа:

Before                           After
"0ABCD TECHNOLOGIES SERVICES"    "0 ABCD TECHNOLOGIES SERVICES"
"ABCD0 TECHNOLOGIES SERVICES"    "ABCD 0 TECHNOLOGIES SERVICES"

"ABCD 0TECHNOLOGIES SERVICES"    "ABCD 0 TECHNOLOGIES SERVICES"
"ABCD TECHNOLOGIES0 SERVICES"    "ABCD TECHNOLOGIES 0 SERVICES"

"ABCD TECHNOLOGIES 0SERVICES"    "ABCD TECHNOLOGIES 0 SERVICES"
"ABCD TECHNOLOGIES SERVICES0"    "ABCD TECHNOLOGIES SERVICES 0"

Я пытался работать с регулярным выражением в Python следующим образом:

text= re.sub(r'([0-9]+)?([A-Za-z]+)?([0-9]+)?',
                 r'\1 \2 \3',
                 text,
                 0,
                 re.IGNORECASE)

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

"0 abcd     technologies     services   "

Как я могу получить добавление пробела в строке без добавления нежелательных пробелов?

Спасибо за ваш руководство:)

1 Ответ

3 голосов
/ 14 января 2020

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

re.sub(r'(?<=\d)(?=[^\d\s])|(?<=[^\d\s])(?=\d)', ' ', text)

См. Демоверсию regex .

Детали шаблона

  • (?<=\d)(?=[^\d\s]) - место между ди git и символом, отличным от ди git и пробелом
  • | - или
  • (?<=[^\d\s])(?=\d) - место между другим символом чем di git и пробел и di git.

Python test :

import re
tests = ['0ABCD TECHNOLOGIES SERVICES',
'ABCD0 TECHNOLOGIES SERVICES',
'ABCD 0TECHNOLOGIES SERVICES',
'ABCD TECHNOLOGIES0 SERVICES',
'ABCD TECHNOLOGIES 0SERVICES',
'ABCD TECHNOLOGIES SERVICES0']

rx = re.compile(r'(?<=\d)(?=[^\d\s])|(?<=[^\d\s])(?=\d)')

for test in tests:
    print(rx.sub(' ', test))

Выход:

0 ABCD TECHNOLOGIES SERVICES
ABCD 0 TECHNOLOGIES SERVICES
ABCD 0 TECHNOLOGIES SERVICES
ABCD TECHNOLOGIES 0 SERVICES
ABCD TECHNOLOGIES 0 SERVICES
ABCD TECHNOLOGIES SERVICES 0
...