В Python мне нужно создать регулярное выражение, которое вставляет пробел между любыми объединенными комбинациями AlphaNum. Например, это то, что я хочу:
8min15sec ==> 8 min 15 sec
7m12s ==> 7 m 12 s
15mi25s ==> 15 mi 25 s
Я ошибаюсь с решениями, найденными в Интернете, но они слишком сложны для меня, чтобы разобрать/изменить. Например, у меня есть следующее:
[a-zA-Z][a-zA-Z\d]*
но он идентифицирует только первую точку вставки: 8Xmin15sec (X)
И это
(?<=[a-z])(?=[A-Z0-9])|(?<=[0-9])(?=[A-Z])
но он находит только этот момент: 8minX15sec (X)
Я мог бы использовать руку с полным синтаксисом для нахождения каждой точки вставки и вставки пробелов.
Демоверсия RegEx101 (такая же ссылка, как указано выше)
Как насчет следующего подхода:
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
Вы можете использовать это регулярное выражение, которое обозначает точку, которая является границей чисел и алфавитов с любым порядком, то есть числом сначала, а затем алфавитами или наоборот.
(?<=\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
Как насчет:
"(\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 '