Moteur de recherche nemo.py

Document

Très léger et très rapide !

Depuis toutes ces années où je code des programmes en shell, je n'ai jamais trouvé un utilitaire UNIX sur Internet qui me permette de chercher des motifs multiples de texte (patterns) dans un fichier texte ! Et, ce, dans n'importe quel ordre d'apparition et sans tenir compte de la casse (Majuscules/minuscules).

J'ai donc créé cet utilitaire qui m'est indispensable dans l'automate Mantra et dans mon système de gestion de connaissances Nemo (~ 900 connaissances/dossiers, > 110 Go sur le disque).

Chaque record ou enregistrement de la base textuelle est enregistré sur UNE ligne ! Quelque soit la longueur de celle-ci !

Ce moteur permet de chercher tel motif ET tel motif ET tel autre, et ainsi de suite. C'est un moteur inclusif ! C'est en cela qu'il est unique...

A vous de donner un nom à votre référentiel de quoique ce soit (collection de disques, timbres, recettes, photos, livres, métadonnées, logs etc...)

je l'appelle KB comme Knowledge Base , terme explicite pour moi.

Je l'avais initialement codé en langage Perl, je l'ai réécris en Python3, ce qui fait qu'il est "portable" entre les différents OS. Il est nativement installé sur Linux et MacOS (de mémoire).

Il faut le rendre exécutable par la commande (terminal) :

chmod +x nemo.py

Voici le code source (20 lignes de code ;-) Il y des commentaires explicites !

#!/usr/bin/env python3
## moteur de recherche multicritères en python3
## BASE de connaissance textuelle en lignes (1 ligne/connaissance)
## nemo.py (c) Didier Jordana (https://glyphe.top)
## Licence Creative Commons BY-SA
## Vous pouvez le copier/le modifier a condition de me citer et de
## partager les mêmes droits aux autres...
import sys, re
if len (sys.argv) <= 2 :
    print ("syntaxe: nemo.py BASE motif1 motif2 ... motif(n)")
    sys.exit (1)

result = open('SEARCH','w')             ## création fichier de sortie SEARCH
base = sys.argv[1]                      ## nom de la BASE en premier
motifs = sys.argv[2:]                   ## motifs de recherche suivent
count = len(motifs)                     ## nbre de motifs, important !
with open(base) as file_in:             ## ouvrir la base
    for line in file_in:                ## analyse chaque record   
        hit = 0                         ## 0 -> compteur de hit, important !
        for motif in (motifs):          ## test présence de chaque motif 
            if (re.search(motif, line, re.IGNORECASE)): ## Maj/Min OK
                hit += 1                ## motif trouvé dans le record
        if hit == count:                ## tous les motifs ont été trouvés -> OK
            print (line)                ## affichage des résultats console
            result.write (line)         ## écriture dans fichier SEARCH
result.close()
sys.exit(0)

La licence proposée est la Creative Commons CC-BY-SA. Ce qui signifie que vous pouvez adapter le code source à votre convenance, à condition que vous me citiez et que vous donniez les mêmes droits aux autres (karma)...

Enjoy !

Document

Retour