it-swarm.com.de

Wie teile ich Strings in Text und Nummer auf?

Ich würde gerne solche Saiten teilen

'foofo21'
'bar432'
'foobar12345'

in

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

Kennt jemand einen einfachen Weg, dies in Python zu tun?

44
domruf

Ich würde dies mit re.match auf die folgende Weise:

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):] 
 ... Kopf, Schwanz 
 ... 
 >>> [Mysplit (s) für s in ['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'

Wenn Sie also eine Liste von Zeichenfolgen mit diesem Format haben:

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

Ausgabe:

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

Noch eine andere Option:

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

Ich bin immer derjenige, der findall () =) aufruft

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

Beachten Sie, dass ich einen einfacheren regulären Ausdruck verwende (weniger zu tippen) als die meisten vorherigen Antworten.

9
PEZ

hier ist eine einfache Funktion, um mehrere Wörter und Zahlen von einer Zeichenfolge beliebiger Länge zu trennen. Die Methode re trennt nur die ersten beiden Wörter und Zahlen. Ich denke, das wird in Zukunft allen anderen helfen,

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

ohne Verwendung von Regex funktioniert die Verwendung der integrierten Funktion isdigit () nur, wenn der Anfangsteil Text und der letzte Teil Zahl ist

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

OUTPUT:

['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