Zastąp cały ciąg z wyjątkiem określonych słów podczas używania pandy python zamień ciąg [duplikat]

Dec 03 2020

Tworzę nową kolumnę w ramce danych pandy i chcę wprowadzić skróconą nazwę dla systemów operacyjnych. Używam wyrażenia regularnego i potrzebuję ścisłego dopasowania słów, aby wykluczyć je z zaznaczenia, jednak gdy zmieniam wyrażenie regularne, aby nie wybierać słów, wówczas następuje zatrzymanie dopasowania ścisłego. Przeczytałem tutaj tyle postów ze słowami regex w dopasowaniu ścisłym i żadne z rozwiązań nie działa.

więc na przykład mam dane, które wyglądają tak:

Android 10kdsh
Chrome OS
Linux ddk2
OS X 10.
Windows 7
iOS c

i chcę, żeby wyglądało to tak:

Android 
Chrome
Linux
OS X
Windows
iOS

Próbowałem kodu w następujący sposób:

def short_OS(webchat):

    webchat["OS"] = webchat["Operating System"].str.replace(('[^(Android|^OS X|^Chrome|^Linux|^Windows|^iOS)]'),"", regex = True)

    return webchat

ale to pozostawia niektóre postacie jako odchodzące:

Androiddsh
ChromeOS
Linuxdd
OS X
Windows
iOS

oczywiście powyższe są tylko przykładami, ale zasada dotycząca niektórych znaków pozostawionych tak, jak są w słowach, jest taka sama.

Powinienem zauważyć, że obramowanie słów za pomocą \ b nie zmieniło wyniku. a jeśli użyję $ na końcu ciągu, w przykładzie „Android” nadal pozostawia „10kdsh” w tej samej linii

czy ktoś może pomóc, proszę?

Dziękuję Ci

Odpowiedzi

1 Thefourthbird Dec 03 2020 at 22:24

Zamiast zastępować, możesz dopasować jedną z alternatyw, wyodrębnić ją do nowej kolumny.

webchat = pd.DataFrame(data, columns=["Operating System"])
webchat["OS"] = webchat["Operating System"].str.extract((r"^(Android|Chrome|Linux|OS X|Windows|iOS)\b"))
print(webchat)

Wynik

  Operating System       OS
0   Android 10kdsh  Android
1        Chrome OS   Chrome
2       Linux ddk2    Linux
3         OS X 10.     OS X
4        Windows 7  Windows
5            iOS c      iOS
MizzH Dec 04 2020 at 05:15

Korzystając z podejścia z @The 4th bird rozwiązałem to za pomocą następującego kodu:

def short_OS(webchat):
 
    webchat["OS"] = webchat["Operating System"].str.extract(r"(\bAndroid\b|\bOS X\b|\bChrome\b|\bLinux\b|\bWindows\b|\biOS\b)")

    return webchat

/ b otaczające słowa było potrzebne, aby uchwycić dokładne słowa