antal bokstäver
Hej! Här är en del av min kod:
for i in range(antalbilar):
regnummer = input("mata in registreringsnummer i format ABC123 eller ABC12A: ")
for a in bokstäver:
if a not in regnummer:
print("fel registreringsnummer")
else:
for a in bokstäver:
for b in siffror:
if len(a) == 3 and len(b) == 3 in regnummer:
Jag vill säga att om det finns tre bokstäver och tre siffror i input så är det rätt. Jag använde därför len(a), men det funkar ej.
Vad är i bokstäver listan?
Förstår inte varför du kör for loopar över denna lista?
SeriousCephalopod skrev:Vad är i bokstäver listan?
Förstår inte varför du kör for loopar över denna lista?
I bokstavslistan finns alla bokstäver i en sträng, dvs a="abcdefghijklmnopqrstuvwxyzåäö".
Finns det något annat förslag istället för for-loop?
Med slicing blir koden både kortare och mer lättläst. Nyttja Pythons strängfunktioner, t ex isalpha(), isdigit() och isalnum().
Är det inte smartare att loopa igenom regnummer och se om de 6 tecknen är bokstav eller siffror som @Lindehaven skriver.
Annars finns det en klass regEx som använder något som heter regular expressions där du kan kontrollera strängen med ett anrop men det kanske är överkurs?
Pythons strängmetoder tar bara hänsyn till ascii (a-z) har jag för mig så din lista "bokstäver" kan nog va bra att använda om du inte vill använda regEx. Dessutom tillåter inte python andra bokstäver än de som ingår i ascii (A-Z, a-z) så bokstäver får du döpa om.
Lindehaven skrev:Med slicing blir koden både kortare och mer lättläst. Nyttja Pythons strängfunktioner, t ex isalpha(), isdigit() och isalnum().
Fast dessa ger ju bara true och false.
CurtJ skrev:Är det inte smartare att loopa igenom regnummer och se om de 6 tecknen är bokstav eller siffror som @Lindehaven skriver.
Annars finns det en klass regEx som använder något som heter regular expressions där du kan kontrollera strängen med ett anrop men det kanske är överkurs?
Jag tror att det är det jag försöker göra men får inte grepp om hur det ska gå till.
Om du har definierat bokstaver
bokstaver="ABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ"
och läst in regnummer från användaren
så kan du loopa igen regnummer och kolla varje tecken i regnumret
for a in regnummer:
if (not a in bokstaver and not a.isdigit()):
#Gör vad du ska om det är otillåtna tecken i regnumret.
Notera här att bokstaver bara innehåller versaler så ska du tillåta inmatning av små bokstäver så behöver du utöka listan bokstaver, alternativt så gör du om regnummer till versaler med metoden upper() först
typ
for a in regnummer.upper():
Som @Lindehaven skriver så kan du också använda slicing som kan se elegantare ut men det är en fråga om tycke och smak.
Att använda regEx är ännu elegantare och effektivare tycker jag men har man svenska tecken så är det meckigt att få till lite beroende på vilken version av python man använder och det är definitivt överkurs för den här nivån av problem.
Om man ska tro Wikipedia så förekommer inte å, ä och ö på registreringsskyltar. Variabeln bokstaver behövs därför inte och Pythons strängmetoder kan användas. Det stämmer att de returnerar False eller True. Det gör att uttrycket för att utvärdera ett registreringsnummer reduceras till ett logiskt uttryck med ett fåtal and-operatorer.
Bokstäverna I och V förekommer inte heller, tror jag.
Tillägg: 19 okt 2021 09:56
En sak din kod gör nu är att ta varje bokstav som finns och se om den förekommer i registreringsnumret. Det finns det förstås alltid nån bokstav som inte gör, så då säger du "fel registreringsnummer".
Det är bra att torrsimma koden: hitta på nån input och kolla sedan vad koden gör, steg för steg. Antingen i huvudet, eller med papper och penna som hjälp, men utan dator.
Ett annat sätt är att använda en debugger och köra programmet steg för steg.
Ett tredje sätt är att lägga in spårutskrifter (alltså vanliga print-satser) som visar hur programmet kör.
Ett fjärde sätt som alla bör använda är automatiserade tester. Definiera en funktion som tar en sträng som parameter och returnerar True
om strängen är ett giltigt registreringsnummer, annars False
. Testa sedan funktionen med olika giltiga och ogiltiga registreringsnummer för att se om den gör rätt.
CurtJ skrev:Om du har definierat bokstaver
bokstaver="ABCDEFGHIJKLMNOPQRSTUVXYZÅÄÖ"
och läst in regnummer från användaren
så kan du loopa igen regnummer och kolla varje tecken i regnumret
for a in regnummer:
if (not a in bokstaver and not a.isdigit()):
#Gör vad du ska om det är otillåtna tecken i regnumret.
Notera här att bokstaver bara innehåller versaler så ska du tillåta inmatning av små bokstäver så behöver du utöka listan bokstaver, alternativt så gör du om regnummer till versaler med metoden upper() först
typ
for a in regnummer.upper():
Som @Lindehaven skriver så kan du också använda slicing som kan se elegantare ut men det är en fråga om tycke och smak.
Att använda regEx är ännu elegantare och effektivare tycker jag men har man svenska tecken så är det meckigt att få till lite beroende på vilken version av python man använder och det är definitivt överkurs för den här nivån av problem.
Men hur kan jag med hjälp av denna kod säga åt programmet att endast inmatning som är tre bokstäver sen tre siffror är rätt? testade med 3*a men det funkade inte.
Lindehaven skrev:Ett fjärde sätt som alla bör använda är automatiserade tester. Definiera en funktion som tar en sträng som parameter och returnerar
True
om strängen är ett giltigt registreringsnummer, annarsFalse
. Testa sedan funktionen med olika giltiga och ogiltiga registreringsnummer för att se om den gör rätt.
Har försökt göra detta med regex nu som du tipsade, där om input har tre bokstäver i början och tre i slutet att den ska lägga till i listan, annars printa "fel registreringsnummer". Men även om jag skriver rätt, dvs AAABBB, så printas "fel registreringsnummer".
for a in bokstäver:
x = re.search("^a{3}\d{3}$", regnummer)
if x:
lista_stulnabilar = lista_stulnabilar.append(regnummer)
else:
print("fel registreringsnummer")
Kanske använder jag regex fel?
Varför iterera strängen bokstaver?
"AAABBB" är inte ett giltigt registreringsnummer.
Det reguljära uttrycket "^a{3}\d{3}$" söker efter "aaa" följt av tre siffror vilket inte är korrekt.
Det reguljära uttrycket bör söka efter tre giltiga bokstäver + två siffror + en siffra eller en giltig bokstav. Exempelvis "^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$"
re.search() returnerar inte True eller False. Den returnerar ett objekt om den fann det reguljära uttrycket, annars None.
Lindehaven skrev:Varför iterera strängen bokstaver?
"AAABBB" är inte ett giltigt registreringsnummer.
Det reguljära uttrycket "^a{3}\d{3}$" söker efter "aaa" följt av tre siffror vilket inte är korrekt.
Det reguljära uttrycket bör söka efter tre giltiga bokstäver + två siffror + en siffra eller en giltig bokstav. Exempelvis "^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$"
re.search() returnerar inte True eller False. Den returnerar ett objekt om den fann det reguljära uttrycket, annars None.
Vad kan man ha istället för re.search()? liksom om jag skriver elif "^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$" in regnummer:
Så kollar den ju bara om hela uttrycket finns i regnummer, eftersom jag satt citationstecken. Måste man inte ha ett reg-kommando?
Hur tänker du när du svarar påfrågan alldeles själv? Om du får se skylten AB2 458, hur resonerar du?
Laguna skrev:Hur tänker du när du svarar påfrågan alldeles själv? Om du får se skylten AB2 458, hur resonerar du?
att det är fel? förlåt förstår inte vad du menar. Det jag undrar är vad man kan använda för reg-kommando istället för reg.search(). Har inte gått igenom detta och blev intresserad av att lära mig hur reg funkar. Hittade bara reg.search() på internet som jag faktiskt förstod.
Hur tänker du? Om du ska förklara för någon varför det inte är en svensk skylt, vad säger du då?
Laguna skrev:Hur tänker du? Om du ska förklara för någon varför det inte är en svensk skylt, vad säger du då?
Det är inte en svensk skylt eftersom en svensk skylt innehåller antingen tre bokstäver följt av tre siffror, eller tre bokstäver följt av två siffror och en bokstav.
Försökte utan regex förresten, vet ej om det är rätt:
elif regnummer[:3] in bokstäver and regnummer[:-3] in siffror:
continue
if regnummer[:3] in bokstäver and regnummer[:-1] in bokstäver and regnummer[3:5] in siffror:
continue
else:
print("fel")
Visst borde det bli rätt?
Men, jag har ett annat problem. För sen, efteråt, har jag en elif-sats med alla bokstavskombinationer som man inte får ha.
elif "APA" or "ARG" or "ASS" or "BAJ" or "BSS" or "CUC" or "CUK" or "DUM" or "ETA" or "ETT" or "FAG" or "FAN" or "FEG" or "FEL" or "FEM" or "FES" or "FET" or "FNL" or "FUC" or "FUK" or "FUL" or "GAM" or "GAY" or "GEJ" or "GEY" or "GHB" or "GUD" or "GYN" or "HAT" or "HBT" or "HKH" or "HOR" or "HOT" or "KGB" or "KKK" or "KUC" or "KUF" or "KUG" or "KUK" or "KYK" or "LAM" or "LAT" or "LEM" or "LOJ" or "LSD" or "LUS" or "MAD" or "MAO" or "MEN" or "MES" or "MLB" or "MUS" or "NAZ" or "NRP" or "NSF" or "NYP" or "OND" or "OOO" or "ORM" or "PAJ" or "PKK" or "PLO" or "PMS" or "PUB" or "RAP" or "RAS" or "ROM" or "RPS" or "RUS" or "SEG" or "SEX" or "SJU" or "SOS" or "SPY" or "SUG" or "SUP" or "SUR" or "TBC" or "TOA" or "TOK" or "TRE" or "TYP" or "UFO" or "USA" or "WAM" or "WAR" or "WWW" or "XTC" or "XTZ" or "XXL" or "XXX" or "ZEX" or "ZOG" or "ZPY" or "ZUG" or "ZUP" or "ZOO" in regnummer:
print("fel registreringsnummer")
Men om jag skriver in exempelvis "ABC123" så får jag "fel registreringsnummer" som beror på något konstigt med just denna ovan och inte de andra elif-satserna. Varför fungerar inte detta?
villsovaa skrev:Laguna skrev:Hur tänker du? Om du ska förklara för någon varför det inte är en svensk skylt, vad säger du då?
Det är inte en svensk skylt eftersom en svensk skylt innehåller antingen tre bokstäver följt av tre siffror, eller tre bokstäver följt av två siffror och en bokstav.
Så vad är det som är fel med skylten, och hur snabbt upptäcker du det?
Laguna skrev:villsovaa skrev:Laguna skrev:Hur tänker du? Om du ska förklara för någon varför det inte är en svensk skylt, vad säger du då?
Det är inte en svensk skylt eftersom en svensk skylt innehåller antingen tre bokstäver följt av tre siffror, eller tre bokstäver följt av två siffror och en bokstav.
Så vad är det som är fel med skylten, och hur snabbt upptäcker du det?
Inmatningen är fel? Borde upptäckas när man skrivit in?
Jag menar fortfarande hur du själv gör. Har du regexpar inprogrammerade i huvudet?
Laguna skrev:Jag menar fortfarande hur du själv gör. Har du regexpar inprogrammerade i huvudet?
Felet med skylten är att det som står är fel. Det upptäcks när man köper bilen. Känner att vi har hamnat lite off track här.
Datorn har samma information som du. Du använder också en algoritm. Om du formulerar den i ord så har du en algoritm som fungerar i datorn också.
Laguna skrev:Datorn har samma information som du. Du använder också en algoritm. Om du formulerar den i ord så har du en algoritm som fungerar i datorn också.
Men varför fungerar inte det här senaste jag gjorde som jag skrev utan regex? För det är så jag skulle formulerat det.
Om strängen av de tre första bokstäverna ingår i strängen av alla bokstäver i alfabetet? "ABC" gör faktiskt det, men t.ex. "ABX" finns inte i "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
Laguna skrev:Om strängen av de tre första bokstäverna ingår i strängen av alla bokstäver i alfabetet? "ABC" gör faktiskt det, men t.ex. "ABX" finns inte i "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
JAHAAAAA. Men hur gör man då? Ska man göra for a in range bokstäver?
Laguna skrev:Om strängen av de tre första bokstäverna ingår i strängen av alla bokstäver i alfabetet? "ABC" gör faktiskt det, men t.ex. "ABX" finns inte i "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
Ok ändrade till
bokstäver = "A" or "B" or "C" or "D" or "E" or "F" or "G" or "H" or "J" or "K" or "L" or "M" or "N" or "O" or "P" or "R" or "S" or "T" or "U" or "W" or "X" or "Y" or "Z"
siffror = "0" or "1" or "2" or "3" or "4" or "5" or "6" or "7" or "8" or "9"
elif regnummer[:3] not in bokstäver:
system("clear")
print("fel")
elif regnummer[3:5] not in siffror:
system("clear")
print("fel")
men det funkar fortfarande inte. Det ger mig fel när jag skriver in tex "ACV133"
Man har mycket glädje av att prova saker i en interaktiv Python. Starta python och skriv in
"A" or "B"
och se vad det blir.
Laguna skrev:Man har mycket glädje av att prova saker i en interaktiv Python. Starta python och skriv in
"A" or "B"
och se vad det blir.
vad är en "interaktiv python"?
Starta python utan att ge den någon fil att läsa in.
villsovaa skrev:Lindehaven skrev:Varför iterera strängen bokstaver?
"AAABBB" är inte ett giltigt registreringsnummer.
Det reguljära uttrycket "^a{3}\d{3}$" söker efter "aaa" följt av tre siffror vilket inte är korrekt.
Det reguljära uttrycket bör söka efter tre giltiga bokstäver + två siffror + en siffra eller en giltig bokstav. Exempelvis "^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$"
re.search() returnerar inte True eller False. Den returnerar ett objekt om den fann det reguljära uttrycket, annars None.
Vad kan man ha istället för re.search()? liksom om jag skriver elif "^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$" in regnummer:
Så kollar den ju bara om hela uttrycket finns i regnummer, eftersom jag satt citationstecken. Måste man inte ha ett reg-kommando?
Du behöver läsa och försöka förstå de tips vi ger dig. Om du svarar på våra frågor så leder vi dig vidare.
Jag skrev ett exempel på vad det reguljära uttrycket kan vara och att re.search()
returnerar ett objekt eller False
. Då kan man prova om det reguljära uttrycket matchar det registreringsnummer som angetts. Exempelvis så här:
# Säkerställ att tecknen är versaler för att förenkla kontrollen av registreringsnumret
regnummer = regnummer.upper()
# Kontrollera om registreringsnumret är korrekt med hjälp av ett reguljärt uttryck
objekt = re.search('^[A-HJ-PR-UW-Z]{3}\d{2}[0-9A-HJ-PR-UW-Z]$', regnummer)
# Om registreringsnumret är korrekt så ...
if objekt != None:
# ... gör din grej
Jag har löst det, tack för hjälpen