Dezimalwerte mit Leerzeichen in einem String - Leerzeichen löschen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Daikoku
User
Beiträge: 66
Registriert: Montag 20. April 2015, 21:14

Hallo,

ich habe einen String mit Dezimalwerte. floating point real values.
Der Trenner ist immer ein Dot nie ein Komma oder irgendetwas anderes.

Ich möchte
a.) die Leerzeichen zwischen dem Integer und dem Fractional part loeschen.
b.) die Vorzeichen bündig ohne Leerzeichen der Dezimalzahl oder einem Integer voranstellen.

Mein erstes Programm funktioniert, jedoch ist es fehlerhaft wenn
ein Dezimalwert '12 . 95' (12 blank dot blank 95) in einem String enthalten ist.

Diesen Fehler kann ich recht einfach mit einer zweiten Funktion beheben.
siehe zweites Programm.

Auch wenn mein Code jetzt funktioniert, gefällt mir dieser nicht wirklich.
Aus diesem Grund habe ich eine Bitte:

a.) eine entsprechende Lösung des Problems mit Hilfe des re Modul einmal aufzuzeigen. Sorry, aber das bekomme ich zur Zeit noch nicht selber hin, und
b.) wie sehe eine gute Lösung ohne das re Modul aus ?

Vielen Dank.

1. Programm

Code: Alles auswählen

# Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32.

def tidyUP(char, string):
    start = string.find(char)
    while start != -1:
        if string[start +2].isdigit():
            string = string[:start +1] + string[start +2:]
        start = string.find(char, start +1)
    return string


def main():
    string = '  mtl.  AZ - 7. 50; tgl. -  BZ -   +  1; wtl.  -/+ CZ =  12 . 95  '
    print '[IN ] :', string

    # Step 1. Alle doppelten Leerzeichen, sowie
    #         die Leerzeichen am Anfang und am Ende enfernen.
    string = ' '.join(string.split())

    # Step 2. Dezimalwerte mit einem Leerzeichen, das Leerzeichen loeschen.
    string = tidyUP('. ', string)

    # Step 3. Dezimalwerten mit einem Vorzeichen, Vorzeichen buendig ohne Leerzeichen.
    string = tidyUP('- ', string)
    string = tidyUP('+ ', string)

    print '[OUT] :', string

    # [IN ] :   mtl.  AZ - 7. 50; tgl. -  BZ -   +  1; wtl.  -/+ CZ =  12 . 95
    # [OUT] : mtl. AZ -7.50; tgl. - BZ - +1; wtl. -/+ CZ = 12 .95

if __name__ == '__main__':
    main()
2. Programm

Code: Alles auswählen

# Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on win32.

def tidyUP_1(char, string):
    start = string.find(char)
    while start != -1:
        if string[start +2].isdigit():
            string = string[:start +1] + string[start +2:]  # ***
        start = string.find(char, start +1)
    return string

def tidyUP_2(char, string):
    start = string.find(char)
    while start != -1:
        if string[start +2].isdigit():
            string = string[:start] + string[start +1:]     # *** Aenderung zu tidyUP_1
        start = string.find(char, start +1)
    return string

def main():
    string = '  mtl.  AZ - 7. 50; tgl. -  BZ -   +  1; wtl.  -/+ CZ =  12 . 95  '
    print '[IN ] :', string

    # Step 1. Alle doppelten Leerzeichen, sowie
    #         die Leerzeichen am Anfang und am Ende enfernen.
    string = ' '.join(string.split())

    # Bei allen Dezimalwerten mit einem Leerzeichen, wird das Leerzeichen geloeschen.
    # - mtl. AZ soll unberuecksichtigt bleiben 7. 55 aber nicht.
    string = tidyUP_1('. ', string)
    string = tidyUP_1('- ', string)
    string = tidyUP_1('+ ', string)
    string = tidyUP_2(' .', string)

    print '[OUT] :', string

    # [IN ] :   mtl.  AZ - 7. 50; tgl. -  BZ -   +  1; wtl.  -/+ CZ =  12 . 95
    # [OUT] : mtl. AZ -7.50; tgl. - BZ - +1; wtl. -/+ CZ = 12.95

if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Woher hast Du denn so verkorkste Nummern her?

Code: Alles auswählen

re.sub(r'(?:(?<=\d)\s+)?([-+.])(?:\s+(?=\d))?',r'\1', string)
Antworten