Python String mit Zahl ersetzen

Revolution

Commodore
Registriert
März 2008
Beiträge
4.964
Hallo zusammen,

Ich hab eine Frage die mir google nicht so einfach beantworten konnte.

Ich habe einen String der 90 Textformen annehmen kann. Da ich den Text kennen würde ich statt text1 gern nur 1 als neuen string haben. Ich könnte das zwar mit der .replace funktion machen aber geht das auch schöner?
 
Was ist denn an replace nicht schön? Und kannst du es vll ein bisschen weiter ausführen? Ich bin mir nicht sicher ob ich komplett verstanden habe, was du machen willst.

Angenommen dein String besteht nur aus Buchstaben und endet mit einer Zahl, dann kannst du einfach alle Buchstaben mit dem Re Modul durch einen Empty String ersetzen und hast nur noch die Zahl.
 
  • Gefällt mir
Reaktionen: BeBur und Oelepoeto
Revolution schrieb:
Da ich den Text kennen würde ich statt text1 gern nur 1 als neuen string haben. Ich könnte das zwar mit der .replace funktion machen aber geht das auch schöner?
Du willst also, wenn ich das richtig verstanden habe, in einem Text eine Zahl finden und extrahieren bzw. den ganzen Text durch die gefundene Zahl ersetzen? Oder doch nicht?
Python:
import re

originaltexte = [ r'text1', r'text2', r'text123' ]
zahlentexte = [ ]

for text in originaltexte:
    zahlentexte.append( re.sub(r'\D', '', text) )

print(originaltexte)
print(zahlentexte)

Oder doch anders?
 
Python:
        s22replaced = (s2[2])\
                          .replace('CDMA BC0','0')\
                          .replace('CDMA BC1','1')\
                          .replace('CDMA BC2','2')\
                          .replace('CDMA BC3','3')\
                          .replace('CDMA BC4','4')\
                          .replace('CDMA BC5','5')\
                          .replace('CDMA BC6','6')\
                          .replace('CDMA BC7','7')\
                          .replace('CDMA BC8','8')\
                          .replace('CDMA BC9','9')\
                          .replace('CDMA BC10','10')\
                          .replace('CDMA BC11','11')\
                          .replace('CDMA BC12','12')\
                          .replace('CDMA BC13','12')\
                          .replace('CDMA BC14','14')\
                          .replace('CDMA BC15','15')\
                          .replace('CDMA BC16','16')\
                          .replace('CDMA BC17','17')\
                          .replace('CDMA BC18','18')\
                          .replace('CDMA BC19','19')\
                          .replace('GSM 450','20')\
                          .replace('GSM 480','21')\
                          .replace('GSM 750','22')\
                          .replace('GSM 850','23')\
                          .replace('GSM 900','24')\
                          .replace('GSM 1800','25')\
                          .replace('GSM 1900','26')\
                          .replace('WCDMA 800','27')\
                          .replace('WCDMA 850','28')\
                          .replace('WCDMA 850 JAPAN','29')\
                          .replace('WCDMA 900','30')\
                          .replace('WCDMA 1500','31')\
                          .replace('WCDMA 1700 US','32')\
                          .replace('WCDMA 1700 JAPAN','33')\
                          .replace('WCDMA 1800','34')\
                          .replace('WCDMA 1900','35')\
                          .replace('WCDMA 2100','36')\
                          .replace('WCDMA 2600','37')\
                          .replace('LTE BAND 1','38')\
                          .replace('LTE BAND 2','39')\
                          .replace('LTE BAND 3','40')\
                          .replace('LTE BAND 4','41')\
                          .replace('LTE BAND 5','42')\
                          .replace('LTE BAND 6','43')\
                          .replace('LTE BAND 7','44')\
                          .replace('LTE BAND 8','45')\
                          .replace('LTE BAND 9','46')\
                          .replace('LTE BAND 10','47')\
                          .replace('LTE BAND 11','48')\
                          .replace('LTE BAND 12','49')\
                          .replace('LTE BAND 13','50')\
                          .replace('LTE BAND 14','51')\
                          .replace('LTE BAND 15','52')\
                          .replace('LTE BAND 16','53')\
                          .replace('LTE BAND 17','54')\
                          .replace('LTE BAND 18','55')\
                          .replace('LTE BAND 19','56')\
                          .replace('LTE BAND 20','57')\
                          .replace('LTE BAND 21','58')\
                          .replace('LTE BAND 22','59')\
                          .replace('LTE BAND 23','60')\
                          .replace('LTE BAND 24','61')\
                          .replace('LTE BAND 25','62')\
                          .replace('LTE BAND 26','63')\
                          .replace('LTE BAND 27','64')\
                          .replace('LTE BAND 28','65')\
                          .replace('LTE BAND 29','66')\
                          .replace('LTE BAND 30','67')\
                          .replace('LTE BAND 31','68')\
                          .replace('LTE BAND 32','69')\
                          .replace('LTE BAND 33','70')\
                          .replace('LTE BAND 34','71')\
                          .replace('LTE BAND 35','71')\
                          .replace('LTE BAND 36','72')\
                          .replace('LTE BAND 37','73')\
                          .replace('LTE BAND 38','74')\
                          .replace('LTE BAND 39','75')\
                          .replace('LTE BAND 40','76')\
                          .replace('LTE BAND 41','77')\
                          .replace('LTE BAND 42','78')\
                          .replace('LTE BAND 43','79')\
                          .replace('TDSCDMA BAND A','80')\
                          .replace('TDSCDMA BAND B','81')\
                          .replace('TDSCDMA BAND C','82')\
                          .replace('TDSCDMA BAND D','83')\
                          .replace('TDSCDMA BAND E','84')\
                          .replace('TDSCDMA BAND F','85')

Oben einmal der fragliche Code. Ich leses die bänder aus und um den Transferweg und die spätere verarbeitung leichter zu machen ersetzt ich den Text mit einer Zahl.

Sieht jetzt natürlich nicht besonders hübsch aus....

Und irgendwas scheint ihm auch nicht zu passen aus LTE Band 20 macht er aus mir nicht ersichtlichen gründen die Zahl 390 kann sich das jemand erklären?
 
LTE Band 2 => 39 Und die 0 ist der Rest von LTE Band 20
Ändern die Reihenfolge
 
  • Gefällt mir
Reaktionen: jb_alvarado
Ich würde durch die Liste iterieren und mit regex arbeiten und einfach ein i counter nutzen um das zu ersetzen
 
Micha- schrieb:
LTE Band 2 => 39 Und die 0 ist der Rest von LTE Band 20
Ändern die Reihenfolge
Hm ok ich verstehe jetzt das Problem. Mir erschließt sich nur nicht warum. Ok er sucht nach 20 sieht 2 und sagt passt. Aber der such string ist doch 20 und nicht 2. Wenn ich das jetzt umdrehen dann habe ich doch das gleiche Problem mit 2 wie mit 20? Und das verstehe ich es sogar weil 2 ja ein Teil von 20 ist aber bei 20 würde mir ne null fehlen für den Match fehlen?

Mystery1988 schrieb:
Ich würde durch die Liste iterieren und mit regex arbeiten und einfach ein i counter nutzen um das zu ersetzen
Ich vermeide regex eigentlich wo ich kann das ist schwarze Magie für mich. Man kann damit Wunder vollbringen aber ich bin einfach zu doof dafür.
 
Ich weiß nicht welche Sprache du verwendest, aber ich kenne das so, das replace (auch) Teil Strings ersetzt.

So oder so, probier es einfach aus.
 
Schöner oder sauberer könnte man das evtl. mit einer Enumeration lösen.

Und zum Thema 390:
Ersetze im String "LTE Band 20" den Teilstring "LTE Band 2" durch den String "39". Was bleibt dann übrig? Wenn man die Reihenfolge umdreht (erst die 20, dann die 2) passiert das nicht.
 
Revolution schrieb:
Wenn ich das jetzt umdrehen dann habe ich doch das gleiche Problem mit 2 wie mit 20?
Bei dem sehr langsamen Konstrukt von Dir geht er von oben nach unten durch, ersetzt in dem Fall das "LTE Band 2" mit "39" und versucht dann im so ersetzen String weiteren Ersetzugen.

Wenn Du wirklich immer die komplette Zeichenketten (und nicht einen Teil innerhalg der Zeichenkette) ersetzen möchtest, würde ich ein dictionary dafür anlegen (Key ist der Suchstring, Value die gewünschte Zahl)
https://www.python-kurs.eu/python3_dictionaries.php
Das arbeitet dann intern mit einer hashtable für den Key:
https://thepythoncorner.com/posts/2020-08-21-hash-tables-understanding-dictionaries/
 
Python:
replace_dict = {f"CDMA BC{i}": str(i) for i in range(19, -1, -1)}
replace_dict.update({f"LTE BAND {i-37}": str(i) for i in range(79, 37, -1)})
replace_dict.update({"GSM 450": "20", "GSM 480": "21", "WCDMA 800": "27", "TDSCDMA BAND A": "80"})

s22replaced = s2[2]
for item in replace_dict:
    s22replaced = s22.replaced.replace(item, replace_dict[item])

Das würde es kürzer machen. Das letzte dict-Update müsstest du natürlich noch vervollständigen. Ich hab dort einfach mal nur exemplarisch ein paar der fehlenden Einträge ergänzt

Eine Alternative wäre es die ganzen Bänder in eine Liste zu schreiben, diese zu invertieren und dann mit einer for-Schleife zu ersetzen.

Python:
bands = ["CDMA BC1", "CDMA BC2", ..., "TDSCDMA BAND F"]
s22replaced = s2[2]
for band, number in reversed(list(zip(bands, range(len(bands))))):
    s22replaced.replace(band, str(number))

Regex macht in diesem Fall nicht viel Sinn, daher würde ich bei replace bleiben und diese nur ein wenig verkürzen / verschönern.
 
Zuletzt bearbeitet:
Zurück
Oben