String trennen

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.
Sirius3
User
Beiträge: 6116
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: String trennen

Beitragvon Sirius3 » Donnerstag 9. Februar 2017, 19:30

@Kreser06: Du solltest dringend Deine Variablenschreibweise an die üblichen Konventionen anpassen; der Code ist deshalb nur schwer lesbar. Warum nichts ausgegeben wird? Du solltest nochmal nachlesen, wie ein Generator funktioniert.
Kreser06
User
Beiträge: 16
Registriert: Samstag 21. Januar 2017, 11:49

Re: String trennen

Beitragvon Kreser06 » Freitag 10. Februar 2017, 20:24

@Sirius3:
Hallo, die Variablenschreibweise werde ich natürlich anpassen, weil ich noch am testen bin ist es etwas lästig alles zu ändern, aber danke für den Tipp.
Und jetzt zu der yield-Anweisung. In meinem Fall werden ja alle Übereinstimmungen im Text gesucht und nacheinander ausgegeben.
  1.         for value in name.values():
  2.             value = re.sub('[\[\(][^\(\)\[\]]*[\]\)]', '', value) # Klammer und deren Inhalt entfernen
  3.             value = re.sub('(?<!(INT))(?<!(int))[_.-](?!\d)', ' ', value) # Unnötige Sonderzeichen entfernen
  4.             value = value.strip()
  5.             yield pattern.findall(value)


Hier wird ja die Dictionary übergeben und mit for value in name.values(): der Wert ausgelesen z.B. 'Text 123 TEXTText1'. Danach im yield pattern.findall(value) werden die passenden RegEx Übereinstimmungen gesucht und alle an yield übergeben. Habe ich das richtig verstanden?

Und wenn ich vom Anfang an nicht die Dict., sondern Direkt den string value z.B. 'Text 123 TEXTText1' an yield weitergebe dann passiert nichts.

Kannst du/ihr mir bitte auf die Sprünge Helfen? Ich komme wirklich nicht weiter. Bin halt Anfänger. :K
Sirius3
User
Beiträge: 6116
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: String trennen

Beitragvon Sirius3 » Freitag 10. Februar 2017, 21:13

@Kreser06: es geht nicht darum, was der Generator macht, sondern wie Du ihn benutzt/aufrufst.
Kreser06
User
Beiträge: 16
Registriert: Samstag 21. Januar 2017, 11:49

Re: String trennen

Beitragvon Kreser06 » Freitag 10. Februar 2017, 21:52

ich hab's.
  1.     for value in playlist.m3u_name_dict.values():
  2.         print (value)
  3.         gen = anpassen.SPLIT(value)
  4.         test = next(gen)
  5.         print (test)


Danke das du es so spanned gemacht hast :D . Aber jetzt verstehe ich das auch. Danke
Benutzeravatar
BlackJack
Moderator
Beiträge: 33023
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: String trennen

Beitragvon BlackJack » Freitag 10. Februar 2017, 22:37

@Kreser06: Das sieht nicht wirklich sinnvoll aus‽
“Programs must be written for people to read, and only incidentally for machines to execute.” — Abelson & Sussman, SICP (preface to the first edition)
Kreser06
User
Beiträge: 16
Registriert: Samstag 21. Januar 2017, 11:49

Re: String trennen

Beitragvon Kreser06 » Freitag 10. Februar 2017, 23:00

ist ja auch noch nicht fertig. Es gibt bestimmt intelligentere Lösungen, aber für mich als Anfänger ist es OK. Der Code funktioniert soweit ganz gut, es tut was es soll. Unten der jetzige Stand. Kommt später noch mehr dazu.

main.py
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from __future__ import print_function
  4. import io
  5. import time
  6. import re
  7.  
  8. from playlist2userbouquet import PLAYLIST, ANPASSEN
  9.  
  10. playlist = PLAYLIST()
  11. anpassen = ANPASSEN()
  12. def DICTS_ERSTELLEN():
  13.     filename_m3u = 'M3U.txt'
  14.     playlist.NAME_DICT_LINK_DICT(filename_m3u)
  15. def NAME_DICT_ANPASSEN():
  16.     for key, value in playlist.m3u_name_dict.items():
  17.         gen = anpassen.SPLIT(value)
  18.         parts = next(gen)
  19.         anpassen.GROSS_KLEIN_SCHREIBUNG(parts)
  20.         playlist.m3u_name_dict[key] = anpassen.name_neu
  21. def TEST():
  22.     for keys, values in playlist.m3u_name_dict.items():
  23.         print (
  24.                 str(keys) + ' - ' +
  25.                 values + ' - ' +
  26.                 playlist.m3u_link_dict[keys]
  27.                 )
  28. def main():
  29.     DICTS_ERSTELLEN()
  30.     NAME_DICT_ANPASSEN()
  31.     TEST()
  32. if __name__ == '__main__':
  33.     main()

playlist2userbouquet.py
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. from __future__ import print_function
  4. import io
  5. import time
  6. import re
  7.  
  8. class PLAYLIST(object):
  9.     def __init__(self):
  10.         self.m3u_name_dict = dict()
  11.         self.m3u_link_dict = dict()
  12.        
  13.     def NAME_DICT_LINK_DICT(self, filename_m3u):
  14.         try:
  15.             with io.open(filename_m3u, 'r', encoding='utf-8-sig') as m3u:
  16.                 i = 1
  17.                 for zeile in m3u:                    
  18.                     if zeile.startswith('#EXTINF'):
  19.                         if zeile[11] != '=' and not zeile.endswith('='):
  20.                             name = zeile.strip().replace('#EXTINF:-1,','')
  21.                             link = m3u.readline().rstrip()
  22.                             self.m3u_name_dict[i] = name
  23.                             self.m3u_link_dict[i] = link
  24.                             i += 1
  25.                            
  26.         except FileNotFoundError:
  27.             msg = 'Die Datei {!r} existiert nicht!'
  28.             print(msg.format(filename_m3u))
  29.         except IOError as error:
  30.             print('Fehler beim Öffnen:', error)
  31.  
  32. class ANPASSEN():
  33.     def __init__(self):
  34.         self.PATTERNS = [
  35.             r'\+\d',                            # +2, +7
  36.             r'\d[+x]\d',                        # 1+1, 2x2
  37.             r'(?<=\b)[A-ZА-Я]{1,2}\d{1,2}\b',   # A1, AB12
  38.             r'\b[JT][ui][CJ][ei]',              # JuCe TV, TiJi
  39.             r'[A-ZА-Я][a-zа-я]+\.?',            # Abzde, int.
  40.             r'[A-Za-zА-Яа-я][A-ZА-Яa-zа-я]+\.?',# ABSDE, Int.
  41.             r'(?<=\b)[A-ZА-Я]{1,2}(?=\b)',      # A, AB, ABC
  42.             r'\d[A-ZА-Я]\b',                    # 1A
  43.             r'\d\.?\d+',                        # 1234, 2.0, 3.123
  44.             r'\d',
  45.             ]
  46.         self.SHORT_NAMES_TO_TITLE = {
  47.             'geo', 'nat', 'дом', 'моя', 'кто', 'hit', 'box',
  48.             'pro', 'doc', 'and', 'sci', 'fi', 'top', 'еда',
  49.             'дон', 'мир', 'ля', 'на', 'раз', 'рен'
  50.             }
  51.         self.LONG_NAMES_TO_IGNORE = {
  52.             'JuCe', 'TiJi', 'HITV', 'НСТВ', 'СССР', 'СТРК'
  53.             }
  54.     def SPLIT(self, value):
  55.         playlist = PLAYLIST()
  56.         patterns = self.PATTERNS
  57.         if isinstance(patterns, dict):
  58.             patterns = patterns.values()
  59.         pattern = re.compile('|'.join(patterns))
  60.         value = re.sub('[\[\(][^\(\)\[\]]*[\]\)]', '', value) # Klammer und deren Inhalt entfernen
  61.         value = re.sub('(?<!(INT))(?<!(int))[_.-](?!\d)', ' ', value) # Unnötige Sonderzeichen entfernen
  62.         value = value.strip()
  63.         yield pattern.findall(value)
  64.     def GROSS_KLEIN_SCHREIBUNG(self, parts):
  65.         renamed_parts = []
  66.         for part in parts:
  67.             if len(part) <= 3:
  68.                 if part.lower() in self.SHORT_NAMES_TO_TITLE:
  69.                     renamed_parts.append(part.title())
  70.                 else:
  71.                     renamed_parts.append(part.upper())
  72.             elif part in self.LONG_NAMES_TO_IGNORE:
  73.                 renamed_parts.append(part)
  74.             else:
  75.                 renamed_parts.append(part.title())
  76.         self.name_neu = ' '.join(part for part in renamed_parts)
  77.        
Benutzeravatar
BlackJack
Moderator
Beiträge: 33023
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: String trennen

Beitragvon BlackJack » Freitag 10. Februar 2017, 23:24

@Kreser06: Das das noch nicht fertig ist macht keinen Unterschied das der Generator komplett sinnfrei ist. Der liefert genau ein Element. Dafür braucht man keinen Generator. Was hast Du Dir dabei gedacht?

Die Klassen `PLAYLIST` und `ANPASSEN` sind semantisch auch keine Klassen. Du machst da ganz komische und umständliche Sachen.


`playlist` und `anpassen` in der `main.py` sollten nicht auf Modulebene stehen. Was auch kein Problem wäre, denn die Klassen sollten gar nicht existieren.

Bevor Du mit ``class`` und ``yield`` arbeitest, verwende doch erst einmal ganz normale Funktionen richtig.

Und mach was gegen diese Namensschreibweise. *Jetzt*. Nicht irgendwann wenn das Programm fertig ist, und es dann doch nicht mehr geändert wird.
“Programs must be written for people to read, and only incidentally for machines to execute.” — Abelson & Sussman, SICP (preface to the first edition)
Kreser06
User
Beiträge: 16
Registriert: Samstag 21. Januar 2017, 11:49

Re: String trennen

Beitragvon Kreser06 » Samstag 11. Februar 2017, 15:29

Hallo BlackJack,
Danke erst mal für die Tipps. Das mit yield wurde mir hier vorgeschlagen, ich habe das einfach übernommen.

Und du hast recht, 'playlist' und 'anpassen' sind nicht da wo sie hingehören, ist mir auch bewusst und wird geändert.

Aber wie sieht es aus mit Klassen? Wie soll ich von der main.py auf die entsprechenden Funktionen in "playlist2userbouquet.py" zugreifen? Ich kenne das halt nur so, bin kein Profi auf dem Gebiet, wie du das sicherlich bemerkt hast. Habe vorher noch nichts mit Programmieren zu tun gehabt und will mir jetzt beibringen. Deswegen bin ich für jeden Tipp und Feedback dankbar.

Vielleicht kannst du mir mein Code überschreiben, damit ich ich auch die Unterschiede von meinem Code und von Einem Profi vergleichen kann. Dafür wäre ich dir sehr dankbar. Aber natürlich wenn du willst, ich will hier keinen zu Last fallen.
Das mit der Namensschreibweise habe ich auch nicht ganz kapiert. Paar Beispiele wären toll.
Nochmals Danke.
Benutzeravatar
snafu
User
Beiträge: 5162
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: String trennen

Beitragvon snafu » Samstag 11. Februar 2017, 16:36

Das yield wurde in Zusammenhang mit einer Schleife vorgeschlagen. Dann ist es sinnvoll. Durch deine Modifikationen fällt auch der Sinn von yield weg. Bei einem einzigen Wert nimmt man normalerweise return.
shcol (Repo | Doc | PyPi)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]