Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Regex nodig voor python  (gelezen 2502 keer)

Offline bart85

  • Lid
Regex nodig voor python
« Gepost op: 2018/04/19, 14:47:43 »
Ik ben een regex nodig dat een match geeft als het een lijst van getallen bevat. Op het moment gebruik ik onderstaande regex, maar hier zit een fout in. Een juiste string is bijv.: 1,2,3 enzovoorts.

'^[0-9,\,]*$'Hier kan de fout ontstaan bij 2 komma's achter elkaar. Er moet nl. wel een getal tussen de komma's staan.
Je leert maar mooi over weg gaan met de commandline. Geen grafische toepassingen voor systeembeheer.
You can never make a system 100% secure unless you unplug the machine from all networks, turn it off, lock it in a safe, smother it in concrete and never use it.

Re: Regex nodig voor python
« Reactie #1 Gepost op: 2018/04/19, 15:24:19 »
@ bartveurink,

Kan je hiermee wat aanvangen ? :   https://www.regular-expressions.info/
én ook:  https://regexr.com/   
info:  https://en.wikipedia.org/wiki/Regular_expression   
én:  https://nl.wikipedia.org/wiki/Reguliere_expressie

Misschien ook:   http://www.rexegg.com/      ... én:   https://www.computerhope.com/jargon/r/regex.htm

eventueel ook :   https://docs.python.org/2/howto/regex.html    ...  én ook:  https://stackoverflow.com/questions/43171384/regex-in-python  ...

én misschien ook dit:   https://docs.python.org/2/library/re.html

... om te helpen, zelf ben ik daarin niet bedreven.

Groet,
spievensterke.
« Laatst bewerkt op: 2018/04/19, 16:57:24 door spievensterke »
Maté - Rolling Release 64bit. Test LinuxMint 21.xx.

Re: Regex nodig voor python
« Reactie #2 Gepost op: 2018/04/19, 20:13:29 »
regex101 is een goede site om uw regex te testen en controleren: https://regex101.com/

Maar zoiets kan ook gewoon met Python. Om even een bekende quote boven te halen:

Citaat
Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

Een vrij eenvoudige one-liner:

all(x.isdigit() for x in s.split(","))
Splits de string via de komma zodat ge een list krijgt. Loop dan over deze lijst en check of elk element een integer is, dit is nu een list met True/False items. Check met all() of alle  items True zijn. Enkele tests:

>>> s = "1,2,3,4"
>>> all(x.isdigit() for x in s.split(","))
True
>>> s = "1,2,3,,4"
>>> all(x.isdigit() for x in s.split(","))
False
>>> s = "1,2,3,4,a,b,c"
>>> all(x.isdigit() for x in s.split(","))
False



Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: Regex nodig voor python
« Reactie #3 Gepost op: 2018/04/20, 01:00:57 »
Goed punt van Nunslaughter. En zo kan je ook makkelijker meteen de getallen eruit halen als je ze nodig hebt :-)

Of als je het toch per se met een regex wilt doen, probeer deze dan eens:

^(?:\d+,)*\d+$
Dit matcht ofwel een getal dat op zichzelf staat vanwege \d+$
ofwel een getal met ervoor een reeks getallen die van elkaar zijn gescheiden met een komma,
omdat er 0, 1 of meer (vanwege de *) keer een getal gevolgd door een komma ervoor mag komen.

\d is overigens identiek aan [0-9]
En ?: wordt gebruikt om een non-capturing groep te definiëren (is niet per se nodig)
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline bart85

  • Lid
Re: Regex nodig voor python
« Reactie #4 Gepost op: 2018/04/22, 10:04:33 »
Op onderstaande manier heb ik dit opgelost.
def chk3(list):
result="true"
for i in list.split(','):
if not re.match('^[0-9]+',i):
result="false"
return result
Je leert maar mooi over weg gaan met de commandline. Geen grafische toepassingen voor systeembeheer.
You can never make a system 100% secure unless you unplug the machine from all networks, turn it off, lock it in a safe, smother it in concrete and never use it.

Re: Regex nodig voor python
« Reactie #5 Gepost op: 2018/04/22, 20:00:34 »
Dit stukje code zal iedere Python programmeur koude rillingen bezorgen :-). Meerdere opmerkingen:

1. De naam van de functie is best slecht. Wat betekent `chk3`?
2. `list` is een builtin, het is best deze niet te gebruiken als variabele. Ook omdat het een string is als input, geen list.
3. In plaats van de strings "true" en "false" te definiëren, gebruik de ingebouwde `True` en `False` booleans.
4. Een regex gebruiken om te kijken of een string een integer is is overkill. Gebruik `str.isdigit()` of cast met `int()` en vang de exception op.
5. Eénmaal duidelijk is dat een element in de lijst geen integer is kunt ge direct de lus afbreken om wat snelheidswinst te behalen.

Hier mijn versie zonder te veel van uw code te veranderen:

def is_all_digits(comma_separated_string):
    for item in comma_separated_string.split(","):
        if not item.isdigit():
            return False
    return True