staging.inyokaproject.org

Für diese Funktion musst du eingeloggt sein.

[PYTHON] - Pattern funktioniert nicht

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

halloICKEbins

Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Morgen,

habe den folgende Code aber leider matcht er nicht mit den Einträgen! Habe schon ein paarmal umgestellt aber ich komme nicht auf den Fehler!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import re

COUNTRY_PATTERN = r'([\w,\s\.])+)'
CODE_PATTERN = 'r([A-Z]{2})'

CONNECTION_RE = re.compile(r'"%s"([\t])+"%s"' % (COUNTRY_PATTERN, CODE_PATTERN))

with open('File') as search_terms:
    for line in search_terms:
        match = CONNECTION_RE.search(line)
        if match:
            country, code = match.groups()
            print(country, "-"code"-")

Inhalt von File (Zwischen dem Ländernamen und den anderen Einträgen sind Tabulatoren):

Ã…LAND ISLANDS 					AX 	ALA 	248
AFGHANISTAN 					AF 	AFG 	004
BOLIVIA, PLURINATIONAL STATE OF 		BO 	BOL 	068
COTE D'IVOIRE 					CI 	CIV 	384
CURAÇAO 					CW 	CUW 	531
VIRGIN ISLANDS (U.S.) 				VI 	VIR 	850

Mein erwartetes Ergebnis wäre jetzt das folgende:

Ã…LAND ISLANDS -AX-
AFGHANISTAN -AF-
BOLIVIA, PLURINATIONAL STATE OF -BO-
COTE D'IVOIRE -CI-
CURAÇAO -CW-
VIRGIN ISLANDS (U.S.) -VI-

Ich weiß, dass der Match nicht ganz passt, wegen der Sonderzeichen im Landnamen! Wie bekomme ich mein erwartetes Ergebnis hin?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Trenn doch einfach die Felder an den Tabulator-Zeichen auf:

1
2
3
4
5
6
7
#!/usr/bin/env python3

with open('ISO-3166-1.txt') as search_terms:
    for line in search_terms:
        line = line.rstrip()
        country, alpha_2, alpha_3, numeric = filter(None, line.split('\t'))
        print("{} -{}-".format(country, alpha_2))

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Wie es aussieht sind die Werte nicht nur durch Tabulatoren getrennt, sondern da ist immer noch ein extra Space vor dem ersten Tabulator - mit einem Regulären Ausdruck ginge das z.B. so:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/usr/bin/env python3
import re

REGEX = re.compile(
    r'^(?P<country>[^\t]+[^\s\t])\s+(?P<alpha_2>\S{2})\s+(?P<alpha_3>\S{3})\s+(?P<numeric>\d{3})')

with open('ISO-3166-1.txt') as search_terms:
    for line in search_terms:
        m = re.match(REGEX, line)
        if m:
            print("{} -{}-".format(m.group('country'), m.group('alpha_2')))

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Manchmal sieht man den Wald vor lauter Bäumen nicht!

Bekomme leider diese Fehlermeldung:

BRAZIL -BR -
BRITISH INDIAN OCEAN TERRITORY -IO -
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
ValueError: too many values to unpack (expected 4)

Fileinhalt:

BRAZIL 						BR 	BRA 	076
BRITISH INDIAN OCEAN TERRITORY 			IO 	IOT 	086
BRUNEI DARUSSALAM		 		BN 	BRN 	096

Wie bekomme ich das Leerzeichen in den Einträgen weg ("-BR -") ?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Ja, die Leerzeichen bringen da einiges durcheinander - für die Regex-Lösung habe ich 8908460 angepasst, wenn man Splitten will, muss man die Strings noch aufräumen:

1
2
3
4
5
6
7
#!/usr/bin/env python3

with open('country.txt') as search_terms:
    for line in search_terms:
        line = line.rstrip()
        country, alpha_2, alpha_3, numeric = filter(None, [s.strip() for s in line.split('\t')])
        print("{} -{}-".format(country, alpha_2))

halloICKEbins

(Themenstarter)
Avatar von halloICKEbins

Anmeldungsdatum:
12. September 2017

Beiträge: 226

Wenn man die Dateischnitzer, wie Zeilenumbrüche und Leerzeichen statt Tabulatoren entfernt, gehts auch 😉

Danke

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Hier bietet sich IMHO re.split() an, weil es weniger Code als bei str.split() ist und ein sehr einfacher regulärer Ausdruck. Ausserdem sollte man die richtige Kodierung angeben. Am besten sollte man immer eine Kodierung angeben wenn man mit Textdateien arbeitet, auch wenn die zufällig mit der ”Standardkodierung” auf dem eigenen System übereinstimmt. Denn das ist ja nur zufällig.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/bin/env python3
# coding: utf-8
import re


def main():
    with open('test.txt', encoding='utf8') as lines:
        for line in lines:
            country, alpha_2, alpha_3, numeric = re.split(r' \t+', line)
            print('{} -{}-'.format(country, alpha_2))


if __name__ == '__main__':
    main()
Antworten |