2017-09-22 5 views
6

J'essaie de supprimer la fin des chaînes dans cette colonne. J'ai vu comment rstrip un caractère spécifique, ou un ensemble de caractères à la fin d'une chaîne, mais comment le faites-vous basé sur un modèle?python rstrip ou supprimer la fin de la chaîne par un modèle de caractères

Je voudrais supprimer la fin entière des chaînes dans la colonne 'team' à l'endroit où nous voyons une minuscule suivie d'une majuscule. Ensuite, supprimez en commençant par les majuscules. Je voudrais que la colonne ci-dessous 'team':

team        pts/g 
St. Louis RamsSt. Louis    32.875 
Washington RedskinsWashington  27.6875 
Minnesota VikingsMinnesota   24.9375 
Indianapolis ColtsIndianapolis  26.4375 
Oakland RaidersOakland    24.375 
Carolina PanthersCarolina   26.3125 
Jacksonville JaguarsJacksonville 24.75 
Chicago BearsChicago    17.0 
Green Bay PackersGreen Bay   22.3125 
San Francisco 49ersSan Francisco 18.4375 
Buffalo BillsBuffalo    20.0 

pour ressembler à ceci:

team        pts/g 
St. Louis Rams      32.875 
Washington Redskins     27.6875 
Minnesota Vikings     24.9375 
Indianapolis Colts     26.4375 
Oakland Raiders      24.375 
Carolina Panthers     26.3125 
Jacksonville Jaguars    24.75 
Chicago Bears      17.0 
Green Bay Packers     22.3125 
San Francisco 49ers     18.4375 
Buffalo Bills      20.0 

Répondre

5

Vous pouvez utiliser re.sub(pattern, repl, string) pour cela.

Utilisons cette expression régulière pour la correspondance:

([a-z])[A-Z].*?() 

Il correspond à un caractère minuscule ([a-z]), suivi d'un caractère majuscule [A-Z] et tout caractère .*? jusqu'à ce qu'il frappe deux espaces (). Le caractère minuscule et les deux espaces sont dans un groupe, afin qu'ils puissent être réinsérés à l'aide \1 pour la première et \2 pour le deuxième groupe lors de l'utilisation re.sub:

new_text = re.sub(r"([a-z])[A-Z].*?()", r"\1\2", text) 

sortie pour votre exemple:

team        pts/g 
St. Louis Rams    32.875 
Washington Redskins  27.6875 
Minnesota Vikings   24.9375 
Indianapolis Colts  26.4375 
Oakland Raiders    24.375 
Carolina Panthers   26.3125 
Jacksonville Jaguars 24.75 
Chicago Bears    17.0 
Green Bay Packers   22.3125 
San Francisco 49ers 18.4375 
Buffalo Bills    20.0 

Ceci a foiré l'alignement de l'espace. Peut-être pas pertinent pour vous, mais si vous voulez remplacer les caractères essuyées avec l'espace, vous pouvez passer une fonction au lieu d'une chaîne de remplacement à re.sub, qui prend un objet Match et retourne un str:

def replace_with_spaces(match): 
    return match.group(1) + " "*len(match.group(2)) + match.group(3) 

Et puis l'utiliser comme ceci (notez que je mets la partie à être remplacé, dans un trop regex groupe):

new_text re.sub(r"([a-z])([A-Z].*?)()", replace_with_spaces, text) 

ce produit:

team        pts/g 
St. Louis Rams      32.875 
Washington Redskins     27.687 
Minnesota Vikings     24.937 
Indianapolis Colts     26.437 
Oakland Raiders      24.375 
Carolina Panthers     26.312 
Jacksonville Jaguars    24.75 
Chicago Bears      17.0 
Green Bay Packers     22.312 
San Francisco 49ers     18.437 
Buffalo Bills      20.0 
+0

ya, l'alignement de la matière ne marche pas. Mais merci pour l'information aussi. C'est très utile pour apprendre comment ça fonctionne. – chitown88

+0

J'ai élargi la réponse pour inclure un moyen de garder l'alignement de toute façon – Felk

0

Eh bien, je ne pense pas que ce soit si facile: à cause des espaces qui peuvent séparer 2 mots qui devraient être supprimés. Je suggère, pour votre problème seulement, d'enlever la plus petite fin qui est aussi une mendicité. hum ... pas très facile à expliquer. Voici une petite fonction et son test:

def smart_rstrip (s): 
    for i in xrange(1,len(s)): 
     if s.endswith(s[:i]): 
      return s[:-i] 
    return s 


s = ['St. Louis RamsSt. Louis', 'Washington RedskinsWashingt...] 
print '\n'.join(s) 
print '\n'.join(map(smart_rstrip,s)) 

Essayez, je chose que vous obtiendrez ce que vous voulez ...