[php/regexp] matchen op namen in tekst

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
Ik heb een stuk tekst en daaruit wil ik namen filteren. Stukje voorbeeld tekst:

code:
1
Volleybalinternational Suzanne Freriks speelt komend seizoen in Spanje. De 23-jarige Freriks heeft een contract voor 1 jaar getekend bij promovendus Bargas Atalia PSG. De 1.78 meter lange spelverdeelster speelde afgelopen seizoen voor Plantina Longa in de Nederlandse Eredivisie.


Nu heb ik de volgende regular expression:

PHP:
1
preg_match_all ('/[^.] ([A-Z]+[a-z]+)/', $lorem, $m);


Dit geeft:

code:
1
Array ( [0] => Suzanne [1] => Spanje [2] => Freriks [3] => Bargas [4] => Plantina [5] => Nederlandse )


Op zich al vrij netjes. Alleen mis ik PSG, Eredivisie, Atalia, Longa en de tweede keer Freriks.

Het mooiste zou zijn om deze output te krijgen:

- Suzanne Freriks
- Spanje
- Bargas Atalia PSG
- Plantina Longa
- Nederlandse Eredivisie
- Freriks

Dus: alle woorden die beginnen met een hoofdletter die niet aan het begin staan van een zin en het liefst gecombineerd in plaats van los.

Ik snap dat er wat problemen mee zijn voor wat betreft een aantal gevallen:

- Jan de Vries (=> geeft Jan en Vries los..)
- Aan het begin van de zin een naam is ook een probleem
- en nog een paar...

Wat is nu een regexp dat mij een vrij goeie output geeft?

Kamer huren


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Hoeveel weet je al van RegExps?
Ken je \A en \Z al?
en de '?' operator?

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
Guillome schreef op donderdag 05 juli 2007 @ 13:53:
Hoeveel weet je al van RegExps?
Ken je \A en \Z al?
en de '?' operator?
Eerlijk gezegd nog weinig. Redelijk basis. \A en \Z komen me zo 123 niet bekend voor. De ? uiteraard wel..

Kamer huren


Acties:
  • 0 Henk 'm!

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 13-09 20:30

kokx

WIN

Mischien even dit als regex gebruiken:
code:
1
/[^.] ([A-Z]+?[a-z]*?)/


Is nog niet helemaal wat je wilt, maar komt er dichter in de buurt.

[ Voor 31% gewijzigd door kokx op 05-07-2007 14:22 ]


Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
kokx schreef op donderdag 05 juli 2007 @ 14:20:
Mischien even dit als regex gebruiken:
code:
1
/[^.] ([A-Z]+?[a-z]*?)/


Is nog niet helemaal wat je wilt, maar komt er dichter in de buurt.
Dan krijg je dit:

Array ( [0] => S [1] => F [2] => S [3] => F [4] => B [5] => A [6] => P [7] => P [8] => L [9] => N [10] => E )

Kamer huren


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

kokx schreef op donderdag 05 juli 2007 @ 14:20:
Mischien even dit als regex gebruiken:
code:
1
/[^.] ([A-Z]+?[a-z]*?)/


Is nog niet helemaal wat je wilt, maar komt er dichter in de buurt.
Dan zou ik nog minstens iets doen als
code:
1
/[^\.] ([A-Z][A-Za-z]*)/

omdat je anders bijvoorbeeld "DataGhost" niet zou matchen in die tekst. Het is trouwens ook niet nodig (zelfs ongewenst) de nongreedy operator te gebruiken, aangezien je toch de hele naam wilt hebben en je geen spaties matcht.
Terwijl ik dit aan het typen was drong trouwens pas tot me door waar dat [^.] voor was, om het eerste woord van een zin niet te matchen! De . betekent eigenlijk min of meer 'alles', die zal je moeten escapen dus. Ik vraag me hierom wel af waarom je bij bepaalde dingen dan output hebt gekregen, mja.

Edit: Ik denk trouwens dat dit is wat je wilt:
code:
1
2
3
4
5
6
7
8
9
10
11
/[^\.] ([A-Z][A-Za-z]*(?: [A-Z][A-Za-z]*)*)/

[1] => Array
        (
            [0] => Suzanne Freriks
            [1] => Spanje
            [2] => Freriks
            [3] => Bargas Atalia PSG
            [4] => Plantina Longa
            [5] => Nederlandse Eredivisie
        )

[ Voor 26% gewijzigd door DataGhost op 05-07-2007 14:42 ]


Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
DataGhost schreef op donderdag 05 juli 2007 @ 14:36:
[...]

Dan zou ik nog minstens iets doen als
code:
1
/[^\.] ([A-Z][A-Za-z]*)/

omdat je anders bijvoorbeeld "DataGhost" niet zou matchen in die tekst. Het is trouwens ook niet nodig (zelfs ongewenst) de nongreedy operator te gebruiken, aangezien je toch de hele naam wilt hebben en je geen spaties matcht.
Terwijl ik dit aan het typen was drong trouwens pas tot me door waar dat [^.] voor was, om het eerste woord van een zin niet te matchen! De . betekent eigenlijk min of meer 'alles', die zal je moeten escapen dus. Ik vraag me hierom wel af waarom je bij bepaalde dingen dan output hebt gekregen, mja.
Hij matcht nu extra PSG maar combinaties van twee woorden met beide hoofdletters is nog steeds geen match.. zit er over te denken hoe dit aan te pakken.

Kamer huren


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

Zoals ik hierboven al geedit heb, de manier om dat aan te pakken is met de (?:-operator, die wel een group ergens van maakt maar deze niet als aparte waarde teruggeeft. Dit kan je uitstekend binnen een matchgroup gebruiken om iets te herhalen ofzo. Zie verder ook man perlre.

Trouwens, in een tekst met iets als "terwijl Piet Kees sloeg" of iets dergelijks (kon niks beters verzinnen :+ ) ga je een false positive krijgen. Zonder zeer geavanceerde taalherkenning ga je daar helaas niks aan doen, denk ik :) Ook als er nummers in een naam staan ga je problemen krijgen trouwens, maar die kan je nu wel zelf oplossen.

edit: heh, en nog hetzelfde verzonnen ook he, Mei? :+

[ Voor 34% gewijzigd door DataGhost op 05-07-2007 14:49 ]


Acties:
  • 0 Henk 'm!

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024

Mei

Sloeg Piet Jan?

Zijn wel twee verschillende namen he ;) Niet dat ik zoveel verstand van regexps heb (ook maar basic), maar wilde het toch even melden :)

//edit: Damn you, DataGhost :P

[ Voor 9% gewijzigd door Mei op 05-07-2007 14:48 ]

Pagina: 1