4
votes

Fractionner une chaîne sur des non chiffres

J'essaie de diviser une chaîne sur n'importe quel caractère qui n'est pas un chiffre.

orig = '0 1,2.3-4:5;6d7'
results = orig.split(r'\D+')

Je m'attends à obtenir une liste d'entiers dans les résultats p >

0, 1, 2, 3, 4, 5, 6, 7

mais à la place j'obtiens une liste avec un seul élément de chaîne qui correspond à la chaîne d'origine.


3 Réponses :


6
votes

Eh bien ... vous utilisez str.split ( ) - qui prend des caractères à diviser à - pas regex. Votre code serait divisé sur n'importe quelle chaîne '\ D +' - à l'intérieur de votre texte:

['0', '1', '2', '3', '4', '5', '6', '7']

Vous pouvez utiliser re.split () à la place:

import re

orig = '0 1,2.3-4:5;6d7'
results = re.split(r'\D+',orig)
print(results)

pour obtenir p>

orig = 'Some\\D+text\\D+tosplit'
results = orig.split(r'\D+')  # ['Some', 'text', 'tosplit']

Utilisez data = list (map (int, results)) pour convertir en int.


1 commentaires

Si vous souhaitez obtenir des sections non numériques et numériques, vous pouvez ajouter un groupe à l'expression régulière: re.split (r '(\ D +)', orig)



1
votes

Essayez ceci:

orig = '0 1,2.3-4:5;6d7'
[i for i in orig if i.isdigit()]


2 commentaires

belle - bien que si vous avez des nombres avec plus d'un chiffre ( '12 142, 92 ') vous obtiendrez [1,2,1,4,2,9,2] < / code> au lieu de [12,142,92]


@PatrickArtner Oui, j'ai remarqué ça. mais peut-être que cela fonctionne pour OP



0
votes
for i in '0 1,2.3-4:5;6d7':
    try:
        print(int(i),end=' ')
    except:
        continue
0 1 2 3 4 5 6 7

2 commentaires

Ce n'est pas «scinder» une liste. Vous imprimez simplement les chiffres.


créer une liste, l = [], puis dans le bloc try / catch '' l.append (int (i)) '' à la place print (int (i)).