J'ai une chaîne comme "a_b_c" ou "a_b_c_d" ou "a_b_c_d_e" . Je veux diviser la chaîne au dernier trait de soulignement.
a='a_b_c'
a=a.split('_')
last=a.pop
a.delete(last)
p a.join("_")
p last
J'ai fait ce qui suit:
**input** 'a_b_c' **output** a_b c **input** 'a_b_c_d' **output** a_b_c d
et j'ai obtenu le résultat, mais je ne pensez pas que cela devrait être fait de cette façon. J'espère qu'il existe une expression régulière pour y parvenir. Y a-t-il quelqu'un qui peut m'aider avec ça?
6 Réponses :
Avez-vous vraiment besoin de vous séparer? Que diriez-vous simplement de remplacer le _ par un espace? par exemple. en utilisant rindex a > et [] =
a[a.rindex('_')] = ' '
Je n'ai pas fait de benchmark, mais split crée un nouveau tableau, qui nécessite généralement plus de ressources, du moins en d'autres langues.
EDIT: comme la question a été éditée, il est maintenant clair que l'OP demande une liste au lieu d'une chaîne de sortie
Divisez-le avec l'expression régulière:
a.split(/_(?=[^_]+$)/)
Explication:
correspond au caractère _ avec Lookahead positif (? = [^ _] + $)
Correspond à un seul caractère non présent dans la liste ci-dessous [^ _] + et $ affirme la position à la fin de la chaîne, ou avant le terminateur de ligne juste à la fin de la chaîne (le cas échéant)
@rene Tout à fait la même raison, mais je le sais en raison d'une question célèbre, ou peut obtenir avec peu de recherche stackoverflow.com/q/12839645/ 10522579
Vous pouvez utiliser String # rpartition qui recherche un modèle donné forme l'extrémité droite de la chaîne et se divise quand il le trouve.
'a_b_c_d_e'.rpartition('_').values_at(0,2)
=> ["a_b_c_d", "e"]
EDIT: appliquer les conseils des commentaires:
'a_b_c_d_e'.rpartition(/_/) => ["a_b_c_d", "_", "e"] s = 'a_b_c_d_e' parts = s.rpartition(/_/) [parts.first, parts.last] => ["a_b_c_d", "e"]
En supposant que vous sachiez que cette chaîne suit ce format:
str = 'a_b_c_d_e' # Remainder str[0...-2] # -> 'a_b_c_d' # Last symbol str[-1] # -> 'e'
cela ne fonctionne que si la partie après le dernier _ a une longueur de un.
Vous pouvez également obtenir des valeurs comme ci-dessous,
> a = a.split('_')
> a[0..-2].join('_')
# => "a_b_c_d"
> a[-1]
# => "e"
'a_b_c_d_e'.split /_(?!.*_)/ #=> ["a_b_c_d", "e"] The negative lookahead (?!.*_) requires that following the match of the underscore there is no other underscore in the string.