Acora è 'fgrep' per Python, un veloce motore di ricerca di testo multi-chiave.
Sulla base di una serie di parole chiave, si genera un automa ricerca (DFAE) e corre sopra ingresso stringa, o unicode o byte.
Acora è basato sull'algoritmo Aho-Corasick e una costruzione powerset NFA a DFA.
Acora viene fornita sia con una implementazione di Python puro e un veloce modulo binario scritto in Cython.
Come si usa?
Importare il pacchetto:
>>> Da acora importazione AcoraBuilder
Raccogliere alcune parole chiave:
>>> Builder = AcoraBuilder ('ab', 'bc', 'de')
>>> Builder.add ('a', 'b')
Generare il motore di ricerca Acora per il set di parole chiave corrente:
>>> Ac = builder.build ()
Cerca una stringa per tutte le occorrenze:
>>> Ac.findall ('abc')
[('A', 0), ('ab', 0), ('b', 1), ('bc', 1)]
>>> Ac.findall ('abde')
[('A', 0), ('ab', 0), ('b', 1), ('de', 2)]
Itera su risultati di ricerca così come arrivano:
>>> Per kw, pos a ac.finditer ('abde'):
... Di stampa ("% 2s [% d]"% (kw, pos))
& Nbsp; a [0]
ab [0]
& Nbsp; b [1]
de [2]
FAQ e ricette
1. Come si esegue una ricerca avida di più lunghe parole chiave corrispondenti?
& Nbsp; >>> builder = AcoraBuilder ('a', 'ab', 'abc')
& Nbsp; >>> ac = builder.build ()
& Nbsp; >>> per kw, pos a ac.finditer ('abbabc'):
& Nbsp; ... print (kw)
& Nbsp; un
& Nbsp; ab
& Nbsp; un
& Nbsp; ab
& Nbsp; abc
& Nbsp; >>> da itertools importazione groupby
& Nbsp; >>> dall'operatore importazione itemgetter
& Nbsp; >>> def longest_match (partite):
& Nbsp; ... per pos, match_set in groupby (partite, itemgetter (1)):
& Nbsp; ... yield max (match_set)
& Nbsp; >>> per kw, pos a longest_match (ac.finditer ('abbabc')):
& Nbsp; ... print (kw)
& Nbsp; ab
& Nbsp; abc
2. Come posso analizzare la riga per riga, come fgrep fa, ma con fine riga arbitrarie?
& Nbsp; >>> def group_by_lines (s, * parole chiave):
& Nbsp; ... builder = AcoraBuilder (' r', ' n', * parole chiave)
& Nbsp; ... ac = builder.build ()
& Nbsp; ...
& Nbsp; ... current_line_matches = []
& Nbsp; ... last_ending = Nessuno
& Nbsp; ...
& Nbsp; ... per kw, pos a ac.finditer (s):
& Nbsp; ... se kw in ' r n':
& Nbsp; ... se last_ending == ' r' e kw == ' n':
& Nbsp; ... continua # combinato CRLF
& Nbsp; ... yield tuple (current_line_matches)
& Nbsp; ... Del current_line_matches [:]
& Nbsp; ... last_ending = kw
& Nbsp; ... altro:
& Nbsp; ... last_ending = Nessuno
& Nbsp; ... current_line_matches.append (kw)
& Nbsp; ... yield tuple (current_line_matches)
& Nbsp; >>> kwds = ['ab', 'bc', 'de']
& Nbsp; >>> per le partite in group_by_lines ('a r r nbc r ndede n nab', * kwds):
& Nbsp; ... stampa (partite)
& Nbsp; ()
& Nbsp; ()
& Nbsp; ('bc',)
& Nbsp; ('de', 'de')
& Nbsp; ()
& Nbsp; ('ab',)
Caratteristiche
- lavora con stringhe Unicode e stringhe di byte
- circa 2-3x veloce come motore delle espressioni regolari in Python per la maggior parte di input
- trova corrispondenze sovrapposte, cioè tutte le partite di tutte le parole chiave
- supporto per caso la ricerca insensitive (~ 10 volte più veloce 're')
- libera la GIL, mentre la ricerca
- ulteriore implementazione di Python puro (lento ma breve)
- supporto per Python 2.5+ 3.x
- Supporto per la ricerca nei file
- licenza BSD permissiva
Cosa c'è di nuovo in questa versione:
- Supporto salamoia per i motori di ricerca predefiniti
- ottimizzazioni delle prestazioni in costruttore
- l'analisi Unicode è ottimizzato per Python 3.3 e poi
- non ricompila fonti quando si installa Cython, meno che l'opzione --with-Cython viene passato al setup.py (richiede Cython 0.20 +)
- generazione non riuscita con le recenti versioni Cython
- costruito utilizzando Cython 0.20.1
Cosa c'è di nuovo nella versione 1.6:
- edificio sostanzialmente più veloce automa
- non include più repo .hg in distribuzione sorgente
- costruito utilizzando Cython 0,15 (RC0)
Cosa c'è di nuovo nella versione 1.5:
- Cython compilato costruzione NFS-2-DFA corre sostanzialmente più veloce
- sempre costruire moduli di estensione, anche se Cython non è installato
- - no-compile interruttore setup.py per evitare edificio modulo di estensione
- costruito utilizzando Cython 0.14.1 (RC2)
Cosa c'è di nuovo in versione 1.4:
- accelerazione minore in anello interno di motore di ricerca
- alcuni pulizia del codice
- costruito utilizzando Cython 0.12.1 (finale)
Requisiti
- Python
I commenti non trovato