Ответ 1
In [32]: import re
In [33]: s='abcd2343 abw34324 abc3243-23A'
In [34]: re.split('(\d+)',s)
Out[34]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A']
Или, если вы хотите разбить первое вхождение цифры:
In [43]: re.findall('\d*\D+',s)
Out[43]: ['abcd', '2343 abw', '34324 abc', '3243-', '23A']
-
\d+
соответствует 1 или более цифрам. -
\d*\D+
соответствует 0 или более цифрам, за которыми следуют 1 или более цифр. -
\d+|\D+
соответствует 1 или более цифрам или 1 или более несимволам.
Проконсультируйтесь с docs для получения дополнительной информации о синтаксисе regex Python.
re.split(pat, s)
разделит строку s
, используя pat
в качестве разделителя. Если pat
начинается и заканчивается круглыми скобками (чтобы быть "группой захвата" ), то re.split
вернет подстроки, также соответствующие pat
. Например, сравните:
In [113]: re.split('\d+', s)
Out[113]: ['abcd', ' abw', ' abc', '-', 'A'] # <-- just the non-matching parts
In [114]: re.split('(\d+)', s)
Out[114]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A'] # <-- both the non-matching parts and the captured groups
Напротив, re.findall(pat, s)
возвращает только части s
, которые соответствуют pat
:
In [115]: re.findall('\d+', s)
Out[115]: ['2343', '34324', '3243', '23']
Таким образом, если s
заканчивается цифрой, вы можете не заканчивать пустую строку, используя re.findall('\d+|\D+', s)
вместо re.split('(\d+)', s)
:
In [118]: s='abcd2343 abw34324 abc3243-23A 123'
In [119]: re.split('(\d+)', s)
Out[119]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123', '']
In [120]: re.findall('\d+|\D+', s)
Out[120]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123']