2 votes

Extraire des liens complexes avec python

J'ai un RegEx qui devrait trouver tous les caractères alphanumériques ou les textes entre crochets comme l'exemple dans le lien ci-dessus. Ces textes sont en fait des liens avec des descriptions (par exemple [[Toto|there's a link here]] est un lien vers la page Toto )

Mais le problème est que je pourrais avoir d'autres textes entre crochets et donc, comme vous pouvez le voir dans le lien, il ne reconnaît pas les crochets à la fin ( ]] ).

Il y a aussi un autre motif important dans ces liens, il y a des tuyaux ( | ) qui séparent mes textes en deux ou trois parties. Dans le cas où il y a deux parties, je veux seulement obtenir le texte de gauche et dans le cas où il y a trois parties, je veux obtenir le texte de droite.

Exemple :

[[File:Euclid flowchart 1.png|vignette|[[Flowchart]] of an algorithm ([[Euclid's algorithm]]).]]

Je veux seulement [[Flowchart]] of an algorithm ([[Euclid's algorithm]]). partie (c'est un png avec une description en dessous et dans cette description il y a d'autres liens)

[[Babylone|Babyloniens]]

Je veux Babylone

Dans le premier exemple, il y a d'autres liens à l'intérieur mais je peux facilement les extraire avec ma première regex ou une récursion.

Vous pouvez voir un exemple de mon code ici

1voto

Michał Turczyn Points 16193

Vous pouvez essayer ce modèle \[\[(.+?)\|(.+?)(\|(.+))?\]\]

Captures de motifs pour grouper les chaînes entre les tuyaux | . J'ai utilisé un opérateur non avide .+? sinon il capturerait tout jusqu'au dernier tuyau. L'opérateur non avide capture jusqu'à la première occurrence du tuyau. Mais le dernier opérateur est gourmand - c'est parce que nous voulons tout capturer jusqu'au dernier pipe. ]] donc le contraire de ce que nous voulions précédemment.

Aussi (\|(.+))? signifie que la troisième partie (à l'exclusion du caractère pipe supplémentaire) est facultative (peut apparaître au maximum une fois).

Cela nécessite également une logique supplémentaire - vous devez d'abord vérifier s'il existe un quatrième groupe de capture, si c'est le cas, cela signifie que la chaîne a été divisée par des tuyaux en trois parties. S'il n'est pas présent, cela signifie que la chaîne a été divisée en deux parties seulement, auquel cas vous voulez obtenir le premier groupe de capture.

Démo

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X