2010-02-15 7 views
1

J'ai un au hasard chaîne générée à partir de 6 lettres sous cette forme, par exemple:manipulation de chaînes en Python

A' B F2 E' B2 A2 C' D2 C D' E2 F 

Quelques lettres ont « ' » ajouté à leur nombre certains ont « 2 ». Ce que je veux, c'est ajouter la lettre "x" à chaque lettre qui est seule.

Il ressemblerait à ceci:

A' Bx F2 E' B2 A2 C' D2 Cx D' E2 Fx 

L'astuce est qu'il ajouterait le « x » uniquement aux lettres qui sont eux-mêmes. Non, Bx -> Bx2.

Des idées?

Répondre

5

Transformez votre chaîne en liste avec séparation()

s = """A' B F2 E' B2 A2 C' D2 C D' E2 F""" 

L = s.split(' ') 

for i in xrange(len(L)): 
    if len(L[i]) == 1: 
    L[i] += 'x' 

str_out = ' '.join(L) 
2

Avec une expression régulière,

import re 
newstring = re.sub(r"\b(\w)(?![2'])", r'\1x', oldstring) 

devrait être bien. Si vous êtes allergique à re s,

news = ' '.join(x + 'x' if len(x)==1 else x for x in olds.split()) 

est une façon concise d'exprimer une transformation similaire (si longueur est vraiment la seule chose que vous devez vérifier avant d'ajouter « x » à un article).

+2

Cela ne fait en raison du fait que 'A'' est considéré comme ayant une frontière de mot entre le' A' et ' ''. (En outre, vous avez oublié un groupe de capture autour du '\ w'.) – Amber

+0

@Dav, merci - bon repérage, la fixation maintenant. –

+1

La version mise à jour nécessite encore un tweak - le groupe de capture ne doit être que le '\ w', et non le caractère suivant. En outre, comme il essaie de faire correspondre un caractère après le '\ w', il ne fonctionnera pas sur un caractère solo à la fin d'une chaîne. – Amber

1
' '.join(n if len(n) == 2 else n + 'x' for n in s.split(' ')) 
1
>>> s="A' B F2 E' B2 A2 C' D2 C D' E2 F".split() 
>>> import string 
>>> letters=list(string.letters) 
>>> for n,i in enumerate(s): 
...  if i in letters: 
...  s[n]=i+"x" 
... 
>>> ' '.join(s) 
"A' Bx F2 E' B2 A2 C' D2 Cx D' E2 Fx" 
>>> 
4

Le split-Comprendre-join Version:

' '.join(n+'x' if len(n)==1 else n for n in inputstr.split(' ')) 

La version regex:

>>> inputstr = "A' F B2 C" 
>>> re.sub(r'([A-Z])(?=\s|$)', r'\1x', inputstr) 
"A' Fx B2 Cx" 

Essentiellement, trouver une lettre majuscule non suivie d'un espace ou la fin de la chaîne, et remplacez-le par ce caractère suivi d'un x. J'ai effectué quelques tests avec timeit; le premier (compréhension de la liste) semble courir un peu plus vite que le second (environ 15-20% plus vite en moyenne). Cela ne semble pas changer quel que soit le nombre de remplacements à effectuer (une chaîne 10 fois plus longue a toujours le même rapport de temps de traitement que l'original).

3

Laide ou Pythonique?

items = "A' B F2 E' B2 A2 C' D2 C D' E2 F".split() 

itemsx = ((a+'x' if len(a)==1 else a) for a in items) 
out = ' '.join(itemsx) 
1
>>> ' '.join((i+'x')[:2] for i in items.split()) 
"A' Bx F2 E' B2 A2 C' D2 Cx D' E2 Fx" 
+0

Cela a fait l'affaire. Je vous remercie. – wtz