kleine Mathe-Spielereien

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
OSWALD
User
Beiträge: 357
Registriert: Freitag 18. März 2022, 17:32

]6.6.2023

Jetzt noch einmal aber mikt Zahlen, jedoch mit der Formatierujg
da klemmt es nolch heftig.
OSWALD

Code: Alles auswählen


mport re
text  ='''Summe der Einkünfte = Gesamtbetrag der Einkünfte 56.374,00
            Beschränkt abziehbare Sonderausgaben:
            Vorsorgeaufwendungen
 Gesamte Altersvorsorgeaufwendungen                                                11.160,00
 davon werden 90% berücksichtigt                                                        10.044,00
 ab AG-Anteil gesetzliche Rentenversicherung/Zuschüsse -                   5.580,00
 Abzugsfähige Altersvorsorgeaufwendungen                                           4.464,00
 Gesamte sonstige Vorsorgeaufwendungen                                             6.191,00
 Begrenzung der Aufwendungen auf                                                        1.900,00
 Mindestens:
 Basiskrankenversicherung und Pflegeversicherung                                5.316,00
 (Kürzung gesetzliche Krankenversicherung um                                      4% berücksichtigt)
 Ansatz des höheren Betrags                                                                   5.316,00
 Abzugsfähige Vorsorgeaufwendungen gesamt                                       9.780,00 »
Unbeschränkt abziehbare Sonderausgaben:
Gezahlte Kirchensteuer                                                                                947,00 »
Summe unbeschränkt abziehbare Sonderausgaben                                    947,00
Einkommen = zu versteuerndes Einkommen                                              45.647,00'''

 
 
pattern = '\w+'
attern = "[0-9]"
pattern_regex = re.compile(pattern)
result = pattern_regex.findall(text)
print(result)




OSWALD
User
Beiträge: 357
Registriert: Freitag 18. März 2022, 17:32

17.06.2023
Seit einigen Tagen versuche ich jetzt mich mit Regex
anzufreunden. Ich verfüge inzwischen über zahlreiche
Beispiele für reguläre Ausdrücke, kann aber nicht beurteilen
ob ich wesentliche Fortschritte gemacht habe.
Anbei ein Code der mit search- und findall-Funktion sowwie
mit diversen pattern experimentieren lässt un viele andere
perfekt laufende Beispiele.
Es ist recht lustig, aber eine Sysiphus -Arbeit.
Gute Zeit OSWALD

Code: Alles auswählen

#
import re
def Silben_finden (word , str):
     #m = re.search(word,str)
     m = re.findall(word,str)
     return  m
str = '''  Arm am Beutel, krank am Herzen 536678 
Schleppt ich meine langen Tage.
Armut ist die größte Plage,
Reichthum ist das höchste Gut! 44
Und zu enden meine Schmerzen,
Ging ich einen Schatz zu graben.
Meine Seele sollst du haben!
Schrieb ich hin mit eignem Blut.
566
Und so zog ich Kreis um Kreise,
Stellte wunderbare Flammen,
Kraut und Knochenwerk zusammen:
die Beschwörung war vollbracht.
Und auf die gelernte Weise124aa
Grub ich nach dem alten Schatze
Auf dem angezeigten Platze;
Schwarz und stürmisch war die Nacht.'''

print("Beliebige  pattern  Silben oder Zahlen eingeben")



#word ='[a-zA-Z0-9] '
#word ='Armut ist die größte Plage'
#word = '\d+'
#word  = '\w+\s'
#word = 'Und zu enden meine Schmerzen,'
#word = 'ab?'
word = '(a|A)'

res = Silben_finden(word,str)
if res is None:
    print("Wort nicht  gefunden!!")
else:
    print("Suche  ist erfolgreich!")

    print()
    print("Das gesuchte Wort/Text  lautet ::",res)


Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Sowohl `Silben_finden()` als auch `word` sind falsch benannt, weil die Funktion keine Silben findet, und `word` kein Wort ist, sondern ein Suchmuster.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OSWALD
User
Beiträge: 357
Registriert: Freitag 18. März 2022, 17:32

23.6.20
Die Beschäftgung mit Regex hat sich quasi als
ein Fass ohne Boden erwiesen. Gleichzeiitig
aber ach ein gewisses Suchtpotential gezeigt.
Inzwischen bin ich auf NUMBA gestossen.
Ich habe die enorme Beschleunigung von
Berechnungen getestet .
Hier der Test mit einem hier bereits einmal
gezeigtem Programm.
(einmal mit und ohne ''import numba' =
Gute Zeit OSWALD

Code: Alles auswählen

from math import  sqrt
import numba
 


def prim(n):
     
    if n % 2 == 0:
       return False
    else:
       for i in range(2,int(sqrt(n))+1):
           if n % i == 0:
              return False
       return True


unten = int(input ("Anfangswert :", ))
oben = int(input("Maximalwert eingeben: ")) # hier der Zusatz #
          
for i in range(unten,oben):
      if prim(i) == True and prim(i) == prim(i+2):

          print(i)
      

Benutzeravatar
grubenfox
User
Beiträge: 430
Registriert: Freitag 2. Dezember 2022, 15:49

... und die schnellere Variante:

Code: Alles auswählen

def prim_schnell(n):
    if n % 2 == 0:
       return False
    else:
       for i in range(3,int(sqrt(n))+1,2):
           if n % i == 0:
              return False
       return True
ohne Numba ungefähr doppelt so schnell im Vergleich zu 'prim'.
OSWALD
User
Beiträge: 357
Registriert: Freitag 18. März 2022, 17:32

23.6.2023
In meinem System Python 3.11 und Spyder 5.1. läuft auch meine wohlgefüllte
Datenbank SQLite 3 ohne Probleme und vor allem sehr schnell.
Ich werde nun NUBA auch auf Compatibiltät mit Visalisierungen prüfen,
was in manchen Fällen auch viel Zeit erdorfert.
Gruss OA SWALD
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Noch mal verdoppeln kann man die Geschwindigkeit wenn man `prim()` nicht direkt hintereinander zwei mal mit dem gleichen Argument aufruft.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OSWALD
User
Beiträge: 357
Registriert: Freitag 18. März 2022, 17:32

24.6.2023
Zum eigentlichen Thema (Mathe-Spielereien)
Derzeit geistert ein 'math.Rätsel' durch das Internet.
Es lautet §**x -2**x = 65
Und im Internet wird es auf umständlichste Weise gelöst.
Es geht aber durch Logarithmieren ganz einfach und noch viel leichter
durch Python. Es zeigt auch die elementare Bedeutung der Logarithmen
für die Mathematik ; heut in der Schule gerne für überflüssig erklärt.
Gruss OSWALD

Code: Alles auswählen

[
#3**x -2**x    #= 65

print(3**2-2**2)
print(3**3-2**3 )
print(3**4-2**4)
print(3**5-2**5)

/code]
Benutzeravatar
grubenfox
User
Beiträge: 430
Registriert: Freitag 2. Dezember 2022, 15:49

OSWALD hat geschrieben: Samstag 17. Juni 2023, 16:19 17.06.2023
Seit einigen Tagen versuche ich jetzt mich mit Regex
anzufreunden. Ich verfüge inzwischen über zahlreiche
Beispiele für reguläre Ausdrücke, kann aber nicht beurteilen
ob ich wesentliche Fortschritte gemacht habe.
Habe ich gerade entdeckt: https://danielfett.de/2006/03/20/regula ... -tutorial/
OSWALD
User
Beiträge: 357
Registriert: Freitag 18. März 2022, 17:32

28.6.23
Ich fange jetzt noch einmal von vorne an.
Ganz einfach. Ich suche , wieviele Klein oder Großbuchstaben
im Text vorkommen. . Hier ein erstes Beispiel.
Dann vielkleicht Silben unterschidlicher Länge usw.
OSWALD

Code: Alles auswählen


import re
text = '''Der Schatzgräber :Arm am Beutel, krank am Herzen Schleppt ich meine langen Tage
Armut ist die größte Plage Reichtum ist das höchste Gut! nd zu enden meine Schmerzen
Ging ich einen Schatz zu graben Meine Seele sollst du haben!Schrieb ich hin mit eignem Blut.
Und so zog ich Kreis um Kreise, Stellte wunderbare Flammen,Kraut und Knochenwerk zusammen:
Die Beschwörung war vollbracht.Und auf die gelernte Weise Grub ich nach dem alten Schatze
Auf dem angezeigten Platze; Schwarz und stürmisch war die Nacht  usw
Der  Schatzgräber findet  1243 5678     7437 9559 .        X X X X X                   '''

 
#pattern = '\w+'
#pattern ='\d+' 
#pattern   = ' [a]'
#pattern     = '[A]'
#pattern = '[S]'
#pattern   ='X'
 

result = re.findall(pattern, text)
print(result)
 
 
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Für 4 von den 6 auskommentierten Mustern braucht man keine regulären Ausdrücke, da könnte man einfach die `count()`-Methode auf Zeichenketten verwenden. Und Zeichenmengen mit nur einem Zeichen machen keinen Sinn.

Code: Alles auswählen

import re

TEXT = """Der Schatzgräber :Arm am Beutel, krank am Herzen Schleppt ich meine langen Tage
Armut ist die größte Plage Reichtum ist das höchste Gut! nd zu enden meine Schmerzen
Ging ich einen Schatz zu graben Meine Seele sollst du haben!Schrieb ich hin mit eignem Blut.
Und so zog ich Kreis um Kreise, Stellte wunderbare Flammen,Kraut und Knochenwerk zusammen:
Die Beschwörung war vollbracht.Und auf die gelernte Weise Grub ich nach dem alten Schatze
Auf dem angezeigten Platze; Schwarz und stürmisch war die Nacht  usw
Der  Schatzgräber findet  1243 5678     7437 9559 .        X X X X X                   """


def main():
    for pattern in [r"\w+", r"\d+"]:
        print(re.findall(pattern, TEXT))

    for text in [" a", "A", "S", "X"]:
        print([text] * TEXT.count(text))


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OSWALD
User
Beiträge: 357
Registriert: Freitag 18. März 2022, 17:32

28.6.23
Und hier die erste Erweiterung. Ich fange vorsichtig
nur mit jenen Patern an, die ich selbst erstelle und die ich
auch wirklich verstehe, um darauf aifzubauen.
Das ist die 1.Erweiterung;
OSWALD.

Code: Alles auswählen


import re
text = '''Der Schatzgräber :Arm am Beutel, krank am Herzen Schleppt ich meine langen Tage
Armut ist die größte Plage Reichtum ist das höchste Gut! nd zu enden meine Schmerzen
Ging ich einen Schatz zu graben Meine Seele sollst du haben!Schrieb ich hin mit eignem Blut.
Und so zog ich Kreis um Kreise, Stellte wunderbare Flammen,Kraut und Knochenwerk zusammen:
Die Beschwörung war vollbracht.Und auf die gelernte Weise Grub ich nach dem alten Schatze
Auf dem angezeigten Platze; Schwarz und stürmisch war die Nacht  usw
Der  Schatzgräber findet  1243    5678     7437  9559   375        X X X X X                   '''

 
#pattern = '\w+'
#pattern ='\d+' 
#pattern   = ' [a]'
#pattern     = '[A]'
#pattern = '[S]'
#pattern   ='X'
 
#pattern =  '[a-zA-Z0-9]'
pattern =     '\d{3,4}'
#pattern = '[a|^b]\w*'   
#pattern = '[a{2}]\w+' 
#pattern = '[c{3}]\w+'
#pattern = '[dB{0}]'
#pattern = '[h][a-b]'
#attern = " [2-35]"
result = re.findall(pattern, text)
print(result)




Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Unter den neuen sind 5 dabei die falsch, beziehungsweise unsinnig aussehen. Einmal ist da wieder einmal eine Zeichenmenge mit nur einem Zeichen dabei — das ist einfach das Zeichen ohne das man das als Zeichenmenge schreiben muss. Und vier Muster sehen so aus als würde das was in der Zeichenmenge steht eine Bedeutung haben die es aber nur ausserhalb der Zeichenmenge *wirklich* hat. Selbst wenn man tatsächlich auf die jeweilige Zeichenmenge die das wirklich bedeutet, testen möchte, sollte man die besser so schreiben, dass man da keine Verwirrung stiften. Also beispielsweise r"[ab|^]\w*", r"[2a{}]\w+", r"[3c{}]\w+", und r"[0dB{}]". Und auch r" [2-35]" ist bescheuert. Das ist das gleiche wie r" [235]" nur das da keiner auf falsche Gedanken kommt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OSWALD
User
Beiträge: 357
Registriert: Freitag 18. März 2022, 17:32

28.6.23
An __blackjack__
Da gibt es eigentlich nur eines: Regex aufgeben.
Gute Zeitm Oswald
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Oswald: so funktioniert Lernen nunmal, man probiert was aus, und fragt jemanden, der sich damit auskennt, ob man es auch richtig verstanden hat. Da Du zu Deinen Patterns nicht dazuschreibst, was Du eigentlich damit erreichen willst, ist es schwierig, zu sagen, ob das was Du Dir dabei gedacht hast, richtig ist oder nicht, aber durch das Lesen und Vergleichen wirst Du selbst irgendwann auch komplizierte Reguläre Ausdrücke entwickeln können.
OSWALD
User
Beiträge: 357
Registriert: Freitag 18. März 2022, 17:32

29.6.23
Soeben habe ich auf -t:N - gelesen:
"Regex ist die Sprache, die Sprachen bändigt – und die Entwickler manchmal zum Weinen bringt. "
Na , das tröstet mich doch immerhin ein wenig.
Und für die 'tröstenden Worte ' danke ich auch - Sirius - ganz herzlich.
Gleiches gilt für die offenen Worte von __blackjack__-
Faztit: ich mache weiter.
Gute Zeit OSWALD
(Wer immer strebend sich bemüht, den können wir erlösen.
OSWALD
User
Beiträge: 357
Registriert: Freitag 18. März 2022, 17:32

29.6.2023
__blackjack__ schreibt
Und auch r" [2-35]" ist bescheuert. Das ist das gleiche wie r" [235]" nur das da keiner auf falsche Gedanken kommt.
Das verstehe ich jetzt nicht.
Auf t:n wird das pattern [1--21] zitiert. wo liegt hier der Unterschied zu " [2- 35]" ?
Ich sehe hier keinen Unterschied.
Ich habe die Zahlenfolge 1 2 1 dem Text zugefügt

Siehe unten.
Gute Zeit OSWALD

Code: Alles auswählen

import re
text = '''Der Schatzgräber :Arm am Beutel, krank am Herzen Schleppt ich meine langen Tage
Armut ist die größte Plage Reichtum ist das höchste Gut! nd zu enden meine Schmerzen
Ging ich einen Schatz zu graben Meine Seele sollst du haben!Schrieb ich hin mit eignem Blut.
Und so zog ich Kreis um Kreise, Stellte wunderbare Flammen,Kraut und Knochenwerk zusammen:
Die Beschwörung war vollbracht.Und auf die gelernte Weise Grub ich nach dem alten Schatze
Auf dem angezeigten Platze; Schwarz und stürmisch war die Nacht  usw
Der  Schatzgräber findet  1243    5678     7437  9559   375        X X X X X          1 2 1         '''

 
#pattern = " [1-35]"

pattern =  "[1-21] "       # Zitat aus  t:n

result = re.findall(pattern, text)
print(result)
 
# wörtliches Zitat aus t:N:
#Dabei ist zu beachten, dass „Ranges“ zusammen mit isolierten Zeichen zusammen funktionieren können: [0-9.,]
# gibt euch eine Zahl oder . oder , zurück.
#Wichtig: „Ranges“ funktionieren nur für Zeichen, nicht aber für Ziffern beziehungsweise Zahlen.
#Der reguläre Ausdruck [1-21] bedeutet nicht: „Finde Ziffern von 1 bis 21“ sondern „Finde die Ziffern 1 oder 2 oder 1.

 





Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja genau, das steht doch da, [1-21] bedeutet nicht „Finde Ziffern von 1 bis 21“, deshalb sollte man das nicht so schreiben, weil es den Leser nur auf falsche Gedanken bringt, wenn eigentlich [12] gemeint ist, also die Menge der Zeichen 1 und 2. [0-9.,] ist die Menge der Zeichen 0,1,2,3,4,5,6,7,8,9,. und , da macht es Sinn die vielen Ziffern durch 0-9 abzukürzen, oder bei a-z
Benutzeravatar
grubenfox
User
Beiträge: 430
Registriert: Freitag 2. Dezember 2022, 15:49

noch'n Link: https://www.webmasterpro.de/coding/einf ... pressions/
und ein Zitat aus dem Text:
Manche Programmierer nennen RegEx auch scherzhaft „schreibgeschützten“ Code, denn reguläre Ausdrücke sind für andere (einschließlich des ursprünglichen Autors) nur sehr schwer oder fast gar nicht lesbar ist, nachdem diese einmal geschrieben wurden.

Da ist etwas wahres dran, finde ich... :?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Na da darf jetzt aber das klassiche Zitat von Jamie Zawinski nicht fehlen: „Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.“ 😈
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten