Question

Je voudrais diviser les chaînes comme celles-ci

'foofo21'
'bar432'
'foobar12345'

dans

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

Est-ce que quelqu'un connaît un moyen simple et facile de faire cela en python?

Était-ce utile?

La solution

Je voudrais aborder ceci en utilisant re.match de la manière suivante:

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

Autres conseils

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

Donc, si vous avez une liste de chaînes avec ce format:

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

Sortie:

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

Encore une autre option:

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

Je suis toujours le seul à invoquer findall () =)

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

Notez que j'utilise une expression rationnelle plus simple (moins typée) que la plupart des réponses précédentes.

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)

sans utiliser regex, en utilisant la fonction intégrée isdigit (), ne fonctionne que si la partie de départ est un texte et que la dernière partie est un numéro

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"))

SORTIE:

['foobar', '12345']
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top