Вставить пробел для разделения соединенных буквенных и числовых строк - Python RegEx

1

В Python мне нужно создать регулярное выражение, которое вставляет пробел между любыми объединенными комбинациями AlphaNum. Например, это то, что я хочу:

8min15sec ==> 8 min 15 sec
7m12s ==> 7 m 12 s
15mi25s ==> 15 mi 25 s

Демо-версия RegEx101

Я ошибаюсь с решениями, найденными в Интернете, но они слишком сложны для меня, чтобы разобрать/изменить. Например, у меня есть следующее:

[a-zA-Z][a-zA-Z\d]*

но он идентифицирует только первую точку вставки: 8Xmin15sec (X)

И это

(?<=[a-z])(?=[A-Z0-9])|(?<=[0-9])(?=[A-Z])

но он находит только этот момент: 8minX15sec (X)

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

Демоверсия RegEx101 (такая же ссылка, как указано выше)

  • 0
    Все ответы превосходны и решают проблему. Ответ г-на Раджванши - единственный, который не добавляет пробела к концу строки, но для моих целей ответ г-на Эванса является наиболее кратким и оптимальным.
Теги:

3 ответа

1
Лучший ответ

Как насчет следующего подхода:

import re

for test in ['8min15sec', '7m12s', '15mi25s']:
    print(re.sub(r'(\d+|\D+)', r'\1 ', test).strip())  

Что даст вам:

8 min 15 sec 
7 m 12 s 
15 mi 25 s
  • 0
    Нет места в настоящее время добавляется в начале? Так должно быть хорошо?
  • 1
    Это вводит нежелательный дополнительный пробел в конце строки, и будет вставлять дополнительный нежелательный пробел, если строка уже содержала пробелы, чего не произойдет в моем решении.
Показать ещё 3 комментария
1

Вы можете использовать это регулярное выражение, которое обозначает точку, которая является границей чисел и алфавитов с любым порядком, то есть числом сначала, а затем алфавитами или наоборот.

(?<=\d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\d)

Это регулярное выражение (?<=\d)(?=[a-zA-Z]) обозначает точку с положительным взглядом, чтобы искать алфавит и позитивный внешний вид, чтобы найти цифру.

Аналогично, (?<=[a-zA-Z])(?=\d) делает то же, но в противоположном порядке.

А затем просто замените эту метку пробелом.

демонстрация

Вот пример кода python для него.

import re
arr = ['8min15sec', '7m12s', '15mi25s']
for s in arr:
 print (s + ' --> ' + re.sub('(?<=\d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\d)', ' ',s))

Что печатает после вывода,

8min15sec --> 8 min 15 sec
7m12s --> 7 m 12 s
15mi25s --> 15 mi 25 s
0

Как насчет:

"(\d+)([a-zA-Z]+)"

в

"\1 \2 "

https://regex101.com/r/yvqCtQ/2

И в python:

In [59]: re.sub(r'(\d+)([a-zA-Z]+)', r'\1 \2 ',  '8min15sec')
Out[59]: '8 min 15 sec '
  • 0
    Что-то странное на моей стороне ... не видеть совпадений / изменений. Вот что я вижу
  • 0
    Это работает в моем firefox: imgur.com/a/wEg7202
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню