web-dev-qa-db-fra.com

Comment diviser des chaînes en texte et en nombre?

Je voudrais diviser des chaînes comme celles-ci

'foofo21'
'bar432'
'foobar12345'

dans

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

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

44
domruf

J'aborderais cela 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")
51
Evan Fosmark
 >>> def mysplit (s): 
 ... head = s.rstrip ('0123456789') 
 ... tail = s [len (head):] 
 ... retour tête, queue 
 ... 
 >>> [mysplit (s) pour s dans ['foofo21', 'bar432', 'foobar12345']] 
 [('foofo', '21'), ('bar', '432'), ('foobar', '12345')] 
 >>> 
28
Mike
>>> 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')]
21

Encore une autre option:

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

Je suis toujours le seul à faire apparaître 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 à taper) que la plupart des réponses précédentes.

9
PEZ

voici une fonction simple pour séparer plusieurs mots et nombres d'une chaîne de n'importe quelle longueur, la méthode re ne sépare que les deux premiers mots et nombres. Je pense que cela aidera tout le monde à l'avenir,

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'] 
1
Bryo Much

sans utiliser regex, en utilisant la fonction intégrée isdigit (), ne fonctionne que si la partie de départ est du 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']
1
roshandev
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)
1
Bug Hunter 219