Python, aantal groups in reguliere expressie icm OR

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tim Schuhmacher
  • Registratie: Januari 2000
  • Laatst online: 15:15
Ik heb de volgende reguliere expressie en wil telefoonnummers matchen. Lukt prima, maar ik vind het niet zo fraai zoals het nu gaat.

Python:
1
>>> phonePattern = re.compile('^(\d{3})\D*(\d{7})|(\d{4})\D*(\d{6})$')

in woorden: match (3 cijfers & onbekend aantal niet-cijfers & 7 cijfers) of (4 cijfers & onbekend aantal niet-cijfers & 6 cijfers)
Maar door de groepering ()()|()() is het resultaat als volgt:

Python:
1
2
3
4
>>> phonePattern.search('0510-123456').groups()
(None, None, '0510', '134567')
>>> phonePattern.search('050-1234567').groups()
('050', '1234567', None, None)

Nou kan ik het resultaat weer filteren op 'None' values, maar liever zou ik uit de expressie maar 2 elementen willen hebben. Kan dat?

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ja. Kijk eens in de documentatie bij (?=...), en bedenk dan iets als
spoiler:
^(\d{3}(?=\D*\d{7}$)|\d{4}(?=\D*\d{6}$))\D*(\d*)$
. Dit is maar een voorbeeld, lijkt me niet handig als je echt NL-telefoonnummers wil matchen, bijvoorbeeld vanwege de \D*, maar ook vanwege 06-nummers ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Tim Schuhmacher
  • Registratie: Januari 2000
  • Laatst online: 15:15
Bedankt, ik had een beperkte cheat sheet blijkbaar gevonden.

Mijn voorbeelden waren versimpeld voor de vraag en 06 en zo hoef ik niet te matchen. Maar zo kom ik weer verder

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Kijk ook eens naar libphonenumber; daar zit ook een findNumbers in die telefoonnummers uit tekst schraapt (en die kan meteen overweg met allerlei uitzonderingen, edge-cases en als bonus een hele shitload meer landen dan alleen NL :P
Geen idee of je vanuit Python tegen een Java lib aan kunt schoppen (vast); wij flikken 't met C# :Y) Met dank aan IKVM voor de geïnteresseerden

[ Voor 30% gewijzigd door RobIII op 08-12-2011 23:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Tim Schuhmacher
  • Registratie: Januari 2000
  • Laatst online: 15:15
oh wat gaaf! Die is zeker bruikbaar.

Desondanks ben ik ook blij dat ik nu van die (?=...) weet

edit:
er is een python port: https://github.com/daviddrysdale/python-phonenumbers

[ Voor 30% gewijzigd door Tim Schuhmacher op 08-12-2011 23:59 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Oh, dat was me ontgaan :P
Er is ook een C# port, maar last I looked was die zo gaar als een klontje :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1