[RegEx] TV series matchen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
Ik ben bezig met iets dat TV series indexeert (nee niets illegaals, maar het ligt gecompliceerd).
Nou vroeg ik me af, zou het mogelijk zijn om met één regex vrijwel alle notaties van afleveringen te matchen? Ik hoef niet het seizoen en de aflevering te hebben, alleen kijken of er wel of niet een match is.

Een aantal voorbeelden van notaties:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
S01E01
S1E1
S01.E01
S1.E01
S1.E1
101
0101
1x01
01x01
01.01
Season 1 Episode 01
Season 01 Episode 01
Season 1 E01
Season 1 E1
Season 01 E01
Season 01 E1
S1 Episode 1
etc.. (eventueel met nog extra spaties ergens toegevoegd)


Het enige dat ik kon vinden was eigenlijk:
http://wiki.xbmc.org/?title=TV_Shows_%28Video_Library%29
Maar dit is niet wat ik bedoel, ik bedoel eigenlijk één regex die alle notaties matched.

Het episode nummer en het season nummer zijn bij mij bekend, dus die kan gewoon ingevuld worden. Titel van de serie of aflevering is totaal onbelangrijk voor mij, het gaat om de episode+season combinatie. Hoofd en kleine letters kunnen buiten beschouwing gelaten worden omdat ik gewoon case insensitive mee geef met m'n preg_match().

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ja, dat kan. ;)

Voor het gros van de regels: Pak de 2 getallen en negeer de rest. Indien het enkel een 3- of 4cijferig getal is weet je blijkbaar ook wat je moet doen.

Klaar, appeltje eitje. Of doe in ieder geval nu eerst zelf een poging. :)

offtopic:
Maar het antwoord zal toch wel weer gespoiled worden, aangezien je hier toch wel mooi kan pronken met geavanceerdebasic regex skills

{signature}


Acties:
  • 0 Henk 'm!

  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
Voutloos schreef op maandag 21 november 2011 @ 21:44:
Ja, dat kan. ;)

Voor het gros van de regels: Pak de 2 getallen en negeer de rest. Indien het enkel een 3- of 4cijferig getal is weet je blijkbaar ook wat je moet doen.

Klaar, appeltje eitje. Of doe in ieder geval nu eerst zelf een poging. :)

offtopic:
Maar het antwoord zal toch wel weer gespoiled worden, aangezien je hier toch wel mooi kan pronken met geavanceerdebasic regex skills
Misschien ben ik vergeten te vermelden, ik ben niet zo'n ster in regex. De simpele dingen lukt mij nog wel, maar ik weet totaal niet hoe ik hier begin.

In principe zou dus [alle letters]?[spatie]?[0]?$season[spatie]?[alle letterskarakters]?[spatie]?[0]?$episode de truc doen. Tenminste, zoals jij het beschrijft. Ik ga prutsen..

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Misschien helpt het als je eens wat spaties toevoegd:
S      01 E       01
S       1 E        1
S      01.E       01
S       1.E       01
S       1.E        1
        1         01
       01         01
        1x        01
       01x        01
       01.        01
Season  1 Episode 01
Season 01 Episode 01
Season  1 E       01
Season  1 E        1
Season 01 E       01
Season 01 E        1
S       1 Episode  1

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
GWTommy schreef op maandag 21 november 2011 @ 22:02:
In principe zou dus [alle letters]?[spatie]?\[0]?$season[spatie]?[alle letterskarakters]?[spatie]?\[0]?$episode de truc doen. Tenminste, zoals jij het beschrijft. Ik ga prutsen..
Nee, ik noemde maar 2 stukken patroon: de getallen en de rest. Kortste definitie van de rest in de vorige zin: alles dat geen getal is.

{signature}


Acties:
  • 0 Henk 'm!

  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
Dus alles behalve de getallen uit een string strippen en dan kijken wat die getallen zijn. Maar als er in een string ook nog ergens verdwaald een titel staat waar een getal in voorkomt? Dan is het idee niks meer waard..

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Tsja, hoe vind je Zoey 101 101? Misschien moet je ook even bedenken wat je wil matchen en wat juist niet... :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • MikeN
  • Registratie: April 2001
  • Laatst online: 20-09 12:51
code:
1
[1-9]\d*\s*(Episode|E|x|\.)?\s*0*\d*

Als hij greedy matched (eventueel case insensitive) en je nog de juiste groups aanmaakt voor je resultaat moet je volgens mij daarmee een heel eind komen. Alleen de 101 is lastig, want is dat nou aflevering 101, seizoen 10 aflevering 1, of seizoen 1 aflevering 1?

[ Voor 20% gewijzigd door MikeN op 22-11-2011 08:13 ]


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Volgens mij is dit alles voor de meesten. Als het enkel 3 of 4 integers zijn kan je dat even los behandelen.
code:
1
[^\d]*(\d+)[^\d]+(\d+)

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!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

101 is eigenlijk altijd season 1 episode 01, of dat zou het moeten zijn. Season 10 episode 1, hoort als 1001 geschreven. :)

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het boeit sowieso niet omdat TS alleen geinteresserd was in het matchen van season/episode, en niet in wat het dan was. :p

Evenwel zou ik ook uit gaan van 2 cijfers voor episode.
spoiler:
ongetest: /(?:s(?:eason)?\s*+)?0?([1-9][0-9]*(?![0-9](?![0-9])))[.x]?(?:\s*+e(?:pisode)?\s*+)?0?([0-9]+)/i

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Waarom zo moeilijk als het ook makkelijk kan, zie mijn post

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!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Guillome schreef op woensdag 23 november 2011 @ 19:56:
Waarom zo moeilijk als het ook makkelijk kan, zie mijn post
Die matched bijvoorbeeld "11-11-11" en "3 Guys, 1 Girl, 2 Weddings" wel en "101" niet (en haalt de eerste 0 van de getallen niet weg hoewel TS dat niet interessant vond). Natuurlijk zou je voor dat laatste eenvoudigweg "|\d{3}" kunnen toevoegen.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

http://www.codinghorror.c...ou-have-two-problems.html

Probeer even de omgekeerde manier. Reduceer de output tot je een fixed formaat hebt.
bvb:
code:
1
2
3
4
5
6
7
8
9
10
11
Season 1 Episode 3
->
S1 Episode 3
->
S1 E3

S01 Episode 03
->
S01 E 03
->
S1 E3

Simpele search and replace tot je iets eenvoudig parsebaar hebt.

ASSUME makes an ASS out of U and ME


  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
Excuses voor mijn afwezigheid.

De manier van H!GHGuY lijkt een goede redenatie. Met str_replace zou ik alle tekstuele waarden kunnen omzetten naar een standaard format (S01E01). Met notaties als 1x01 of 1-01 zou dat eventueel ook nog kunnen. Maar dan zit ik nog steeds met het probleem dat 101 verkeerd gematched kan worden, of in principe alle vage notaties bij shows waar de titel (deels) bestaat uit cijfers.

Ik ga eens aan de slag, kijken hoe ver ik kom met het replacen en vervolgens matchen.

  • Cartman!
  • Registratie: April 2000
  • Niet online
Het grote probleem is volgens mij al dat je eerst moet weten waar die gegevens beginnen in je titel, ik denk dat het mogelijk al helpt door je woorden eerst om te draaien in volgorde. Zo kun je eerst episode en seizoen matchen, de rest van de gegevens heb je niet nodig dan. Zo voorkom je ieder geval dat bij series met een getal erin hij dat als seizoen pakt. Niet getest hoor, tis maar een idee :)

  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
    function match($episode, $filename) {
        $f = str_replace(' ', '', strtoupper($filename));
        $f = str_replace('EASON', '', $f);
        $f = str_replace('PISODE', '', $f);
        $f = str_replace(array('-E', '.E', 'XE'), 'E', $f);
        
        list($partSeason, $partEpisode) = explode('E', substr($episode, 1));
        $shortSeason = (substr($partSeason, 0, 1) == '0') ? substr($partSeason, 1) : $partSeason;
        $shortEpisode = (substr($partEpisode, 0, 1) == '0') ? substr($partEpisode, 1) : $partEpisode;
        $f = str_replace(array($partSeason . $partEpisode,
                               $partSeason . 'X' . $shortEpisode,
                               $partSeason . 'X' . $partEpisode,
                               $partSeason . '-' . $shortEpisode,
                               $partSeason . '-' . $partEpisode,
                               $partSeason . '.' . $shortEpisode,
                               $partSeason . '.' . $partEpisode,
                               $shortSeason . $partEpisode,
                               $shortSeason . 'X' . $shortEpisode,
                               $shortSeason . 'X' . $partEpisode,
                               $shortSeason . '-' . $shortEpisode,
                               $shortSeason . '-' . $partEpisode,
                               $shortSeason . '.' . $shortEpisode,
                               $shortSeason . '.' . $partEpisode,
                               'S' . $shortSeason . 'E' . $shortEpisode,
                               ), $episode, $f);
        
        if (preg_match("_" . $episode . "_i", $f)) return true;
        else {
            echo $episode . ' niet gematched in ' . $filename . '<br />';
            return false;
        }
    }
    
    $filenames = array('S01E01',
                       'Season 01 Episode 01',
                       'Season01 Episode01',
                       'S01-E01',
                       'S01.E01',
                       'S01xE01',
                       'Season 01 E 01',
                       'S 01 E 01',
                       '101',
                       '1x01',
                       '1x1',
                       '01x01',
                       '1.01',
                       '1.1',
                       '01.01',
                       'S1.E1',
                       'S1-E1',
                       'S1xE1');
    $count = 0;
    foreach ($filenames as $filename)
    if (match('S01E01', '24.' . $filename . '.08PM-09PM.HDTV.XviD-FQM')) $count++;
    echo 'Totaal ' . count($filenames) . ' notaties waarvan ' . $count . ' gematched.';


Dit matched alle notaties opgegeven.
Ziet er iemand nog een verbeterpunt of probleem dat ik over het hoofd zie?
Pagina: 1