2017-09-22 17 views
6

Próbuję usunąć koniec ciągów w tej kolumnie. Widziałem, jak radzić sobie z konkretną postacią lub określoną liczbą znaków na końcu łańcucha, ale jak to zrobić na podstawie wzorca?python rstrip lub usuń koniec łańcucha według wzoru znaków

Chciałbym usunąć cały koniec ciągów w kolumnie 'team', w miejscu, w którym widzimy małe litery, a następnie wielkie litery. Następnie usuń zaczynając od wielkich liter. Chciałbym poniższego 'team' kolumna:

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 

aby wyglądać tak:

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 

Odpowiedz

5

Można użyć re.sub(pattern, repl, string) do tego.

Użyjmy tego wyrażenia regularnego dla dopasowania:

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

Pasuje mała litera charakter ([a-z]), a następnie przez wielką literą [A-Z] i charakteru .*? dopóki nie natrafi dwie przestrzenie (). Mała litera charakter i dwie przestrzenie są w grupie, dzięki czemu mogą one zostać ponownie wprowadzony za pomocą \1 dla pierwszego i \2 dla drugiej grupy przy użyciu re.sub:

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

wyjściowy dla przykładu:

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 

To doprowadziło do wyrównania przestrzeni w górę. nie może być istotne dla ciebie, ale jeśli chcesz, aby zastąpić otarł znaki z miejsca, można przekazać funkcję zamiast ciągiem zastępczym do re.sub, który odbywa się Match obiekt i zwraca str:

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

I następnie używać go tak (zauważ, jak kładę do-zastąpiony udział w grupie regex zbyt):

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

ta produkuje:

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, sprawa robi wyrównanie. Ale także dzięki za epilację. To bardzo pomocne w nauce, jak to działa. – chitown88

+0

Rozszerzyłem odpowiedź, dodając sposób na utrzymanie wyrównania – Felk

0

Cóż, nie sądzę, że to takie proste: ze względu na spacje, które mogą oddzielać 2 słowa, które powinny zostać usunięte. Proponuję, tylko dla twojego problemu, usunąć najmniejsze zakończenie, które jest również żebraniem. hum ... nie bardzo łatwe do wytłumaczenia. Oto mały, a jego funkcja testu:

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)) 

Spróbuj, I rzeczą, jaką można uzyskać to, czego chcą ...

Powiązane problemy