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