Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[Python]RegExp: Alle matches naar een array

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi allemaal,

Mijn vraag is heel simpel, maar ik kan het antwoord niet vinden.
Het is me gelukt om een regex te doen op een string. Output kan ik ook naar variabelen zetten.
Wat is echter wil (gewoon omdat het netter is), is het naar een array te zetten.
En vervolgens de variabelen declareren aan de hand van die array.

Dit heb ik:
code:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python

import re

line = "Hello, I am Sam."
matched = re.search(r'(.*),.*\ (.*)\.', line)
if matched:
    greet = matched.group(1)
    name = matched.group(2)
    print "greet :" + greet
    print "name :" + name


En wat ik zou willen. En dat moet toch kunnen zegt mijn perl-ervaring... :)
code:
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python

import re

line = "Hello, I am Sam."
matched = re.search(r'(.*),.*\ (.*)\.', line)
if matched:
    (greet, name) = matched.group(1)
    print "greet :" + greet
    print "name :" + name


Maar dit werkt dus niet.
Iemand een idee hoe ik dit wel python-style noteer?

Dank

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

re.findall ?

Verwijderd

Topicstarter
Met de re.findall kreeg ik het alleen voor elkaar dezelfde match meerdere keren te tonen.
Maar niet verschillende matches dus zoals in mijn voorbeeld staat beschreven.

Ik zie net dat mijn voorbeeld niet zo handig gekozen was.
Ik had het beter zo kunnen doen:
code:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python

import re

line = "Hello, I am Sam."
matched = re.search(r'(H.*),.*\ (S.*)\.', line)
if matched:
    greet = matched.group(1)
    name = matched.group(2)
    print "greet :" + greet
    print "name  :" + name

Waar greet dus Hallo als waarde heeft, en name Sam als waarde heeft.

Met re.findall lukt me dit dus niet.
(bron: http://stackoverflow.com/...2551/python-regex-findall)
code:
1
2
3
4
5
import re
regex = ur"\[P\] (.+?) \[/P\]+?"
line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday."
person = re.findall(regex, line)
print(person)

Ik krijg het echter niet gedaan deze code zo aan te passen dat 'ie bijvoorbeeld matcht op (Barack) en (Obama) en dit in een array plaatst

[ Voor 3% gewijzigd door Verwijderd op 17-04-2014 16:41 ]


  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 18:42
findall gebruik je om meerdere matches met hetzelfde pattern te vinden; dat is niet wat je in je oorspronkelijke code doet.

Er is niets mis met de (werkende) code die je al hebt, maar het kan inderdaad iets korter. Je wilt nog steeds group 1 en 2 hebben, dus alleen matched.group(1) zoals in "wat ik zou willen" gaat niet werken. Als we nog even niet de documentatie lezen, kunnen we een van de volgende regels gebruiken om een lijst van lengte 2 te genereren en de elementen van die lijst aan twee aparte namen te binden:
Python:
1
2
greet, name = [matched.group(i) for i in [1,2]]
greet, name = map(matched.group, [1,2])

De documentatie begint haar beschrijving van de group-methode echter als volgt:
Returns one or more subgroups of the match. If there is a single argument, the result is a single string; if there are multiple arguments, the result is a tuple with one item per argument.
Dus:
Python:
1
greet, name = matched.group(1,2)

NB: We hebben respectievelijk een lijst en een tupel gebruikt, geen array.

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
code:
1
a,b = matched.groups()

?

https://docs.python.org/2...tml#re.MatchObject.groups

Je terminologie is trouwens een beetje onduidelijk: 'meerdere matches' interpreteer ik als 'meerdere matches van de hele regexp in de string', niet 'de capturing groups in de regexp'.

[ Voor 47% gewijzigd door ValHallASW op 17-04-2014 17:53 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Overigens is dit niet erg efficient: '(.*),', het is meestal een stuk beter om '([^,]*),' te doen.

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Behalve dat dat wat anders doet. ([^,]*), is equivalent aan '(.*?), (non-greedy match), niet aan (.*), (greedy match). (regexp klikbaar voor online voorbeeld met 'a,b,c' als input)

Verwijderd

Topicstarter
Ah thanks!

Het antwoord van Raynman was precies wat ik zocht.

Sorry voor iedereen als mijn uitleg een beetje onduidelijk was. Kwam ik zelf ook achter toen ik er op verder ging.
Voor wat betreft de notaties van de regex-en; Dat is me duidelijk.
De vraag bestreek veel meer mijn python-probleem. Niet zozeer de regex.

Nogmaals dank iedereen!
Ik moet nog een beetje wennen aan de python-terminologie, maar de eerste stapjes doen goed.
(Lijst en de array enzo... ;) )

Overigens dacht ik dat dat ik de notatie van ValHallASW geprobeerd had. Kennelijk niet. Want dat werkt gewoon :(
Verdorie. Had me een hoop tijd gescheeld. 8)7

[ Voor 13% gewijzigd door Verwijderd op 17-04-2014 22:04 ]

Pagina: 1