Regex для отделения Numeric от Alpha - PullRequest
4 голосов
/ 29 января 2010

У меня есть куча строк:

"10people"
"5cars"
..

Как бы я разделить это на?

['10','people']
['5','cars']

Это может быть любое количество цифр и текста.

Я думаю о том, чтобы написать какое-то регулярное выражение - однако я уверен, что в Python есть простой способ сделать это.

Ответы [ 7 ]

8 голосов
/ 29 января 2010
>>> re.findall('(\d+|[a-zA-Z]+)', '12fgsdfg234jhfq35rjg')
['12', 'fgsdfg', '234', 'jhfq', '35', 'rjg']
8 голосов
/ 29 января 2010

Используйте регулярное выражение (\d+)([a-zA-Z]+).

import re
a = ["10people", "5cars"]
[re.match('^(\\d+)([a-zA-Z]+)$', x).groups() for x in a]

Результат:

[('10', 'people'), ('5', 'cars')]
3 голосов
/ 29 января 2010
>>> re.findall("\d+|[a-zA-Z]+","10people")
['10', 'people']

>>> re.findall("\d+|[a-zA-Z]+","10people5cars")
['10', 'people', '5', 'cars']
2 голосов
/ 29 января 2010

Обычно разделение на /(?<=[0-9])(?=[a-z])|(?<=[a-z])(?=[0-9])/i разделяет строку таким образом.

0 голосов
/ 30 января 2010

Использование идеи jsbueno с использованием str.translate с последующим разделением:

import string

allchars = ''.join(chr(i) for i in range(32,256))
digExtractTrans = string.maketrans(allchars, ''.join(ch if ch.isdigit() else ' ' for ch in allchars))
alpExtractTrans = string.maketrans(allchars, ''.join(ch if ch.isalpha() else ' ' for ch in allchars))

data = "5people10cars"
numbers = data.translate(digExtractTrans).split()
names = data.translate(alpExtractTrans).split()

Вам нужно создать таблицы перевода только один раз, затем вызывать translate и split так часто, как вы хотите.

0 голосов
/ 29 января 2010

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

data = "5people10cars"

numbers = "".join(ch if ch.isdigit() else "\n" for ch in data).split()
names = "".join(ch if not ch.isdigit() else "\n" for ch in data).split()

final = zip (numbers, names)
0 голосов
/ 29 января 2010
>>> import re
>>> s = '10cars'
>>> m = re.match(r'(\d+)([a-z]+)', s)
>>> print m.group(1)
10
>>> print m.group(2)
cars
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...