1
votes

Fractionner la chaîne avec le dernier trait de soulignement

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?


0 commentaires

6 Réponses :


2
votes

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


0 commentaires

2
votes

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)


1 commentaires

@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



7
votes

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


0 commentaires

-1
votes

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'


1 commentaires

cela ne fonctionne que si la partie après le dernier _ a une longueur de un.



2
votes

Vous pouvez également obtenir des valeurs comme ci-dessous,

> a = a.split('_')
> a[0..-2].join('_')
# => "a_b_c_d" 
> a[-1]
# => "e" 


0 commentaires

2
votes
'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.

0 commentaires