Toon posts:

[regex] greediness? of een ander probleem?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een textdocument in het volgende formaat:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
* Markeer, page 3
text text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text text

* Markeer, page 3
text text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text text

text text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text text

* Markeer, page 3
text text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text text
* Markeer, page 4

text text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text text

text text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text texttext text text


Er kunnen dus breaks voor/na of in de tekst zitten, maar dat hoeft niet per se.

Ik wil hier middels een regex de text en het bijbehorende pagina nummer eruithalen

Dit gaat op zich prima middels \* Markeer, page ([0-9]+)\n+([^*]+)

Het probleem is echter dat hij de text pakt inclusief de breaks erachter.

En als je de volgende gebruikt \* Markeer, page ([0-9]+)\n+([^\n]+) heb je een probleem als er een of meer breaks IN de tekst zitten.

Ik zit me hier nu al uren op scheel te staren en heb van alles geprobeerd zonder resultaat. Heb als referentie de http://www.regular-expressions.info/ handleiding gebruikt.

Ik wil dus de blokken tekst eruit filteren met de omliggende breaks eruit gefilterd, maar de breaks die erin zitten behouden met de bijbehorende paginanummer.

Ik heb het idee dat het heel simpel op te lossen is en dat het probleem in de greediness zit, maar zie nog niet precies hoe.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waar hoort mijn topic?

WEB>>PRG ;)

Verder: voldoet een simpele trim of rtrim niet? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Zoiets zou moeten werken
code:
1
Markeer, page (\d+)\s+([^*]+?)\s*(\*|$)


De nettere optie zou overigens splitten op "* Markeer, page " zijn in combinatie met een trim/strip/chomp operatie.

[ Voor 43% gewijzigd door Wolfboy op 01-10-2008 18:13 . Reden: nu ook nog ungreedy gemaakt ;) ]

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
WEB>>PRG
Excuses, had me iets te lang blind lopen staren ;)
code:
1
Markeer, page (\d+)\s+([^*]+)\s*(\*|$)
Tnx :) Werkt bijna. Deze haalt nog steeds de newlines aan het eind van de blokken text niet weg. En daarbij blijft het allereerste sterretje '*' aan het begin van het document staan. Ik snap eerlijk gezegd deze [code](\*|$)[/code] notatie niet helemaal.

[ Voor 21% gewijzigd door Verwijderd op 01-10-2008 10:07 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 01 oktober 2008 @ 09:53:
Tnx :) [...] En daarbij blijft het allereerste sterretje '*' aan het begin van het document staan. [...]
Sorry, dit is natuurlijk simpel op te lossen met:
code:
1
[^\d]+(\d+)\s+([^*]+)\s*(\*|$)


Nu alleen nog de newlines. dat is namelijk het probleem waar ik vanaf het begin af aan op stukviel.

dit:
code:
1
([^*]+)
pakt alles, inclusief newlines tot het sterretje.

Hoe aan te geven dat hij alle tekst moet pakken tot 0 of meer newlines gevolgd met een sterretje, zonder stuk te lopen op breaks binnen de tekst

[ Voor 30% gewijzigd door Verwijderd op 01-10-2008 10:17 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, ik heb 'm. Moest 'm inderdaad lazy maken:

code:
1
[^\d]+(\d+)\s+([^*]+?)(\s+\*)


tnx :)

[ Voor 4% gewijzigd door Verwijderd op 01-10-2008 10:39 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hm, nu pakt hij alleen het allerlaatste blok niet :(

dit blijft over aan het eind van de tekst:
Markeer, page 4
text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text

[ Voor 77% gewijzigd door Verwijderd op 01-10-2008 10:44 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Kijk eens naar zero-width look-ahead. Dus iets als:
code:
1
\* Markeer, page ([0-9]+)\n+(.*?)(?=\n+\* Markeer, page |\n*$)

(uitgegaan van modifier s - voor het matchen van \n)
Het kan soms zijn dat je daarna wil beginnen met (?!\n*$) om de bonus-matches te voorkomen, maar dat is hier niet nodig.

[ Voor 11% gewijzigd door pedorus op 01-10-2008 10:49 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hm, dat gaat me een beetje boven de pet, maar ik zal er eens induiken.

Is er geen teken om het eind van het bestand aan te duiden? Dan is het simpel op te lossen met

code:
1
(\s+\*|\s+<einde bestand teken>)

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op woensdag 01 oktober 2008 @ 10:50:
Is er geen teken om het eind van het bestand aan te duiden?
http://www.regular-expressions.info/anchors.html

Maar dan blijf je houden dat sterretjes in de tekst niet mogen.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Verwijderd schreef op woensdag 01 oktober 2008 @ 10:50:
Is er geen teken om het eind van het bestand aan te duiden? Dan is het simpel op te lossen met

code:
1
(\s+\*|\s+<einde bestand teken>)
Daarom had ik (\*|$) staan ;)

Als je PCRE_MULTILINE of PCRE_DOLLAR_ENDONLY aan zet (uitgaande van PCRE, ik zie niet in je posts staan welke regex standaard je gebruikt) dan werkt het :)

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wolfboy schreef op woensdag 01 oktober 2008 @ 16:40:
[...]
Daarom had ik (\*|$) staan ;)

Als je PCRE_MULTILINE of PCRE_DOLLAR_ENDONLY aan zet (uitgaande van PCRE, ik zie niet in je posts staan welke regex standaard je gebruikt) dan werkt het :)
Dat deed het 'm (bijna!)

De zoek-en-vervang functie van het programma wat ik gebruik gebruikt ICU als regex engine.

regex:
code:
1
[^\d]+(\d+)\s+([^*$]+)\s*(\*|$)?m


replace:
code:
1
\\begin\{quote\}\n$2 \\cite\[$1\]\{\}\n\\end\{quote\}\n\n


Alles ziet er helemaal perfect uit, behalve (wederom) het laatste blok. Hier gebeurt iets raars:

code:
1
2
* Markeer, page 4
Sometimes we renegotiate inclusion and exclusion in order to maintain or increase the privileges of citizenship. In other words, no boundaries, no matter how taken-for-granted they have become, are permanent


wordt

code:
1
2
3
4
5
\begin{quote}
Sometimes we renegotiate inclusion and exclusion in order to maintain or increase the privileges of citizenship. In other words, no boundaries, no matter how taken-for-granted they have become, are per \cite[4]{}
\end{quote}

anent

:?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee, er gaat veel meer fout zie ik nu:

aan het begin van het bestand al:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
* Markeer, page 1


This paper takes a closer look at the paradoxes of globalisation as a process of inclusion and exclusion, empowerment and enslavement, 

citizenship and subjection, hope and disappointment.

* Markeer, page 1
It argues that the neo-liberal rhetoric and euphoria on globalisation must be countered with the reality of exclusion for all but an elite few.



* Markeer, page 1
Yet, although structurally excluded, the bulk of ordinary people in Africa refuse to celebrate victimhood. Thanks to their ability to manoeuvre and manipulate, and thanks to the sociality and conviviality of their cultural communities, Africans have refused to internalise and surrender to marginalisation by states weakened by the profit motives of global capital. Thus, the paper also explores some of the creative strategies employed by Africans to appropriate, gatecrash, cushion, subvert or resist the effects of their exclusion by the global structures of inequality.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\begin{quote}
This paper takes a closer look at the paradoxes of globalisation as a process of inclusion and exclusion, empowerment and enslavement, 

citizenship and subjection, hope and disappoint \cite[1]{}
\end{quote}

\begin{quote}
It argues that the neo-liberal rhetoric and euphoria on globalisation  \cite[1]{}
\end{quote}

ust be countered\begin{quote}
Yet, although structurally excluded, the bulk of ordinary people in Africa refuse to celebrate victimhood. Thanks to their ability to manoeuvre and manipulate, and thanks to the sociality and conviviality of their cultural communities, Africans have refused to internalise and surrender to marginalisation by states weakened by the profit motives of global capital. Thus, the paper also explores some of the creative strategies e \cite[1]{}
\end{quote}

ployed\begin{quote}


Letters en zinsdelen vallen dus weg, de quote codes worden halverwege ingevoegd...

Nogmaals de regex:
code:
1
[^\d]+(\d+)\s+([^*$]+)\s*(\*|$)?m

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Probeer dan deze nog eens ;)
Search:
code:
1
[\s\*]+Markeer, page (\d+)\s+([^*]+?)\s*(\*|$)?m


Ik gebruik bij Kodos dit als vervanging, dus voor jou zou je huidige vervang string al moeten werken.
code:
1
\\begin{quote}\n\2 \\cite[\1]{}\n\\end{quote}\n\n

[ Voor 90% gewijzigd door Wolfboy op 01-10-2008 18:38 ]

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee, zelfde probleem, de tekst wordt middenin (schijnbaar random, maar dat is natuurlijk niet zo) onderbroken.

Maar de hulp wordt gewaardeerd :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
deze werkt tot nog toe het beste:
code:
1
[^\d]+(\d+)\s+([^*]+?)(\s+\*)


buiten dat het allerlaatste stukje tekst niet meegenomen wordt...

Deze wordt alleen niet meegenomen omdat hij geen sterretje vind op het eind. Hier moet toch wel een oplossing voor gevonden kunnen worden?

als ik 'm vervolgens verander naar:
code:
1
[^\d]+(\d+)\s+([^*]+?)(\s+\*|$)
pakt hij de laatste wel, maar gaat het fout bij de eerste (waar een newline in de tekst zit)

Zou ik het niet met de hexidecimale of ascii code voor een EOF charackter kunnen proberen? Heb gezocht, maar nog niet kunnen vinden wat dat is. Er is geen specifiek EOF regex karakter?

[ Voor 71% gewijzigd door Verwijderd op 01-10-2008 18:49 ]


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Vreemd, hier werkt het prima. Zou een klein stukje script dat het in 1x vervangt in je bestand ook een optie zijn of moet het via je editor? Dit is namelijk in maximaal 10 regels gefixt :P

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
moet niet, wil het eigenlijk op een manier automatiseren. Helaas ben ik daar dan net niet handig genoeg voor. Op osx heb je daar bijv. automator of folder-actions voor. Vooral het laatste zou mijn probleem kunnen oplossen: hang een folderactie aan een folder die elk bestand wat erin gegooid wordt doorzoekt en vervangt.

Het gaat namelijk om meerdere bestanden

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb 'm :)

code:
1
[^\d]+(\d+)\s+([^*]+?)(\s+\*|\s*\z)


Dit
code:
1
|\s*\z
deed 't 'm (dus inderdaad een of-clausule of het bestand is afgelopen.

Bedankt voor alle input!
Pagina: 1