Reguljärt uttryck
Hej! jag försöker skriva ett reguljärt uttryck som ska matcha ett aritmetiskt uttryck som:
- Består av ett eller flera heltal som är åtskiljda av någon av operatorerna för de fyra räknesätten: +, -, *, /
- Heltalen kan ha inledande nollor
- I början av ett uttryck kan det finnas ett plus- eller minustecken, dock tillåts inte detta på tal i mitten av uttryck
- En ekvation är två uttryck separerade av ett likhetstecken så bara ett likhetstecken får förekomma
Mitt försök är: "^[+-]?[0-9]+([+-*/][0-9]+)*=[+-]?[0-9]+([-+*/][0-9]+)*$", men det passerar inte testerna vilket jag antar beror på att \ måste användas vid specialtecknena. Jag vet dock inte hur den används och skulle vara tacksam för lite hjälp!
Har du provat regex101? Det kommer inte ge dig svaret, men det kommer säga till om du har ett ogiltigt regex. Sen när du fixat det kan du lätt använda sidan till att testa med.
Du har rätt i att du behöver "escapa" några specialtecken, precis som du säger genom att sätta \ framför. Sidan kommer visa vilka. Efter att ha fixat det så verkar ditt regex fungera bra. Fast det verkar inte ha stöd för variabler, så det är lite begränsat för ekvationer.
Man ska matcha ett uttryck, och sedan står det ekvation. Vet man att det måste förekomma ett likhetstecken?
- inuti klamrar [ ] tolkas nog speciellt. Prova att sätta minustecknet först eller sist.
Nej det måste inte kunna förekomma likhetstecken, jag har nu uppdaterat till: "^([\+\-]?\d+([\+\-\*/]\d+)*=[\+\-]?\d+([\+\-\*/]\d+)*)|([\+\-]?\d+([\+\-\*/]\d+)*)$" men det funkar fortfarande inte men nu borde väl tecknen behandlats rätt? Så jag förstår inte vart det blir fel.
Vet du att \d fungerar?
Testade nu med [0-9] istället, "^([\+\-]?[0-9]+([\+\-\*/][0-9]+)*=[\+\-]?[0-9]+([\+\-\*/][0-9]+)*)|([\+\-]?[0-9]+([\+\-\*/][0-9]+)*)$", och det blev ändå fel så kan inte bara berott på \d iallafall.
Får du veta mer om dina tester än bara om de passeras eller inte?
Den enda information jag får är att testet misslyckas när det: Testar funktionen på många små strängar, men enligt mina gissningar är det det första testet och jag tror inte mitt regex fungerar alls.
18/-35
*23
000=0
7=7=7
3.14159265358
Just nu matchar den följande uttryck fast den inte ska det, vet nån vad det kan bero på+
Jag ger dig ett exempel
re.compile("^([+-]*\\d[\\+\\-\\*\\/]\\d)+$")
Den här säger att du startar med x eller - eller inget alls. * betyder 0 eller fler repetitioner.
Sen har du \d som säger att du ska ha ett heltal, dubbla \ för att "escapa" det i strängen.
Sen har du en grupp med de fyra operatorerna +-*/, alla escapade
Sen avslutar du med ett heltal igen
Allt inneslutet i parentes med en repetitionsoperator(+) som anger att allt kan repeteras 1 eller fler gånger.
Start och stop (^$) behövs egentligen inte men det skadar inte heller.
Kommer du vidare då?
Rättning: Du behöver inte \\ för operatorerna.
re.compile("^([+-]*\\d+[\+\-\*\/]\\d+)+$")
Rättning av rättning: Jo det behöver du (jag=tröttmössa)