Как разбить строки на текст и число? - программирование
Подтвердить что ты не робот

Как разбить строки на текст и число?

Я хотел бы разделить строки, подобные этим

'foofo21'
'bar432'
'foobar12345'

в

['foofo', '21']
['bar', '432']
['foobar', '12345']

Кто-нибудь знает простой и простой способ сделать это в python?

4b9b3361

Ответ 1

Я бы подошел к этому, используя re.match следующим образом:

match = re.match(r"([a-z]+)([0-9]+)", 'foofo21', re.I)
if match:
    items = match.groups()
    # items is ("foo", "21")

Ответ 2

>>> def mysplit(s):
...     head = s.rstrip('0123456789')
...     tail = s[len(head):]
...     return head, tail
... 
>>> [mysplit(s) for s in ['foofo21', 'bar432', 'foobar12345']]
[('foofo', '21'), ('bar', '432'), ('foobar', '12345')]
>>> 

Ответ 3

>>> r = re.compile("([a-zA-Z]+)([0-9]+)")
>>> m = r.match("foobar12345")
>>> m.group(1)
'foobar'
>>> m.group(2)
'12345'

Итак, если у вас есть список строк с таким форматом:

import re
r = re.compile("([a-zA-Z]+)([0-9]+)")
strings = ['foofo21', 'bar432', 'foobar12345']
print [r.match(string).groups() for string in strings]

Вывод:

[('foofo', '21'), ('bar', '432'), ('foobar', '12345')]

Ответ 4

Еще один вариант:

>>> [re.split(r'(\d+)', s) for s in ('foofo21', 'bar432', 'foobar12345')]
[['foofo', '21', ''], ['bar', '432', ''], ['foobar', '12345', '']]

Ответ 5

Я всегда должен поднять findall() =)

>>> strings = ['foofo21', 'bar432', 'foobar12345']
>>> [re.findall(r'(\w+?)(\d+)', s)[0] for s in strings]
[('foofo', '21'), ('bar', '432'), ('foobar', '12345')]

Обратите внимание, что я использую более простое (менее типичное) регулярное выражение, чем большинство предыдущих ответов.

Ответ 6

import re

s = raw_input()
m = re.match(r"([a-zA-Z]+)([0-9]+)",s)
print m.group(0)
print m.group(1)
print m.group(2)

Ответ 7

без использования регулярных выражений, с использованием встроенной функции isdigit(), работает, только если начальная часть - текст, а последняя - номер

def text_num_split(item):
    for index, letter in enumerate(item, 0):
        if letter.isdigit():
            return [item[:index],item[index:]]

print(text_num_split("foobar12345"))

ВЫХОД:

['foobar', '12345']

Ответ 8

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

def seperate_string_number(string):
    previous_character = string[0]
    groups = []
    newword = string[0]
    for x, i in enumerate(string[1:]):
        if i.isalpha() and previous_character.isalpha():
            newword += i
        elif i.isnumeric() and previous_character.isnumeric():
            newword += i
        else:
            groups.append(newword)
            newword = i

        previous_character = i

        if x == len(string) - 2:
            groups.append(newword)
            newword = ''
    return groups

print(seperate_string_number('10in20ft10400bg'))
# outputs : ['10', 'in', '20', 'ft', '10400', 'bg'] 

Ответ 9

Вот простое решение этой проблемы, нет необходимости в том, чтобы "ходить по кошкам" на клавиатуре, я имею в виду регулярное выражение :)) наслаждайтесь ^ - ^

user = input('Input: ') # user = 'foobar12345'
int_list, str_list = [], []

for item in user:
 try:
    item = int(item)  # searching for integers in your string
  except:
    str_list.append(item)
    string = ''.join(str_list)
  else:  # if there are integers i will add it to int_list but as str, because join function only can work with str
    int_list.append(str(item))
    integer = int(''.join(int_list))  # if you want it to be string just do z = ''.join(int_list)

final = [string, integer]  # you can also add it to dictionary d = {string: integer}
print(final)