web-dev-qa-db-fra.com

python re.split () pour diviser par des espaces, des virgules et des points, mais pas dans des cas comme 1000 ou 1,50

Je veux utiliser python re.split() pour diviser une chaîne en mots individuels par des espaces, des virgules et des points. Mais je ne veux pas "1,200" à diviser en ["1", "200"] ou ["1.2"] à diviser en ["1", "2"].

Exemple

l = "one two 3.4 5,6 seven.eight nine,ten"

Le résultat doit être ["one", "two", "3.4", "5,6" , "seven", "eight", "nine", "ten"]

24
rohanag

Utilisez un lookahead négatif et un lookbehind négatif:

> s = "one two 3.4 5,6 seven.eight nine,ten"
> parts = re.split('\s|(?<!\d)[,.](?!\d)', s)
['one', 'two', '3.4', '5,6', 'seven', 'eight', 'nine', 'ten']

En d'autres termes, vous divisez toujours par \s (espaces blancs), et uniquement divisé par des virgules et des points s'ils ne sont pas suivis (?!\d) ou précédé (?<!\d) par un chiffre.

DÉMO .

[~ # ~] modifier [~ # ~] : selon le commentaire @verdesmarald, vous pouvez utiliser à la place ce qui suit:

> s = "one two 3.4 5,6 seven.eight nine,ten,1.2,a,5"
> print re.split('\s|(?<!\d)[,.]|[,.](?!\d)', s)
['one', 'two', '3.4', '5,6', 'seven', 'eight', 'nine', 'ten', '1.2', 'a', '5']

Cela divisera "1.2,a,5" en ["1.2", "a", "5"].

DÉMO .

51
João Silva

Vous voulez donc diviser les espaces, les virgules et les périodes qui ne sont pas entourées de chiffres. Cela devrait fonctionner:

r" |(?<![0-9])[.,](?![0-9])"
3