Acora er "fgrep 'for Python, en rask multi-søkeord tekst søkemotor.
Basert på et sett av søkeord, genererer det et søk automat (DFA) og kjører den over strengen innspill, enten unicode eller bytes.
Acora er basert på Aho-Corasick algoritme og en NFA-til-DFA Powerset konstruksjon.
Acora kommer med både en ren Python implementering og en rask binær modul skrevet i Cython.
Hvordan bruker jeg den?
Importere pakken:
>>> Fra acora import AcoraBuilder
Samle noen søkeord:
>>> Byggmester = AcoraBuilder ('ab', 'bc', 'de')
>>> Builder.add ('a', 'b')
Generere Acora søkemotor for gjeldende søkeord sett:
>>> Ac = builder.build ()
Søk en streng for alle forekomster:
>>> Ac.findall ('abc')
[('A', 0), ('ab', 0), ('b', 1), ('bc', 1)]
>>> Ac.findall ('Abde')
[('A', 0), ('ab', 0), ('b', 1), ('de', to)]
Iterere over søkeresultatene som de kommer inn:
>>> For kw, pos i ac.finditer ('Abde'):
... Print ("% 2s [% d]"% (kw, pos))
& Nbsp; en [0]
ab [0]
& Nbsp; b [1]
de [2]
vanlige spørsmål og oppskrifter
1. Hvordan kjører jeg en grådig søk for de lengste matchende søkeord?
& Nbsp; >>> byggmester = AcoraBuilder ('a', 'ab', 'abc')
& Nbsp; >>> ac = builder.build ()
& Nbsp; >>> for kw, pos i ac.finditer ('abbabc'):
& Nbsp; ... print (kw)
& Nbsp; en
& Nbsp; ab
& Nbsp; en
& Nbsp; ab
& Nbsp; abc
& Nbsp; >>> fra itertools importere groupby
& Nbsp; >>> fra operatør import itemgetter
& Nbsp; >>> def longest_match (kamper):
& Nbsp; ... for pos, match_set i groupby (kamper, itemgetter (1)):
& Nbsp; ... utbytte max (match_set)
& Nbsp; >>> for kw, pos i longest_match (ac.finditer ('abbabc')):
& Nbsp; ... print (kw)
& Nbsp; ab
& Nbsp; abc
2. hvordan gjør jeg analysere linje for linje, som fgrep gjør, men med vilkårlige linjeavslutninger?
& Nbsp; >>> def group_by_lines (s, * nøkkelord):
& Nbsp; ... byggmester = AcoraBuilder (' r', ' n', * nøkkelord)
& Nbsp; ... ac = builder.build ()
& Nbsp; ...
& Nbsp; ... current_line_matches = []
& Nbsp; ... last_ending = None
& Nbsp; ...
& Nbsp; ... for kw, pos i ac.finditer (er):
& Nbsp; ... hvis kw i ' r n':
& Nbsp; ... hvis last_ending == ' r' og kw == ' n':
& Nbsp; ... fortsette # kombinert CRLF
& Nbsp; ... utbytte tuppel (current_line_matches)
& Nbsp; ... del current_line_matches [:]
& Nbsp; ... last_ending = kw
& Nbsp; ... annet:
& Nbsp; ... last_ending = None
& Nbsp; ... current_line_matches.append (kw)
& Nbsp; ... utbytte tuppel (current_line_matches)
& Nbsp; >>> kwds = ['ab', 'bc', 'de']
& Nbsp; >>> for kampene i group_by_lines ('a r r nbc r ndede n fakke', * kwds):
& Nbsp; ... Print (kampene)
& Nbsp; ()
& Nbsp; ()
& Nbsp; ('bc',)
& Nbsp; ('de', 'de')
& Nbsp; ()
& Nbsp; ('ab',)
Egenskaper
- fungerer med Unicode-strenger og byte-strenger
- om 2-3x så fort som Pythons vanlig uttrykk motor for de fleste innspill
- finner overlappende kampene, det vil si alle kampene i alle søkeord
- støtte til små bokstaver søk (~ 10x så fort som 're')
- frigjør GIL mens du søker
- ekstra (sakte men kort) ren Python implementering
- støtte for Python 2.5+ og 3.x
- støtte for søk i filer
- givende BSD-lisens
Hva er nytt i denne versjonen:
- pickle støtte for pre-bygget søkemotorer
- ytelsesoptimaliseringer i byggmester
- Unicode parsing er optimalisert for Python 3.3 og senere
- ikke lenger recompiles kilder når Cython er installert, med mindre --with-cython alternativet er sendt til setup.py (krever Cython 0,20 +)
- bygge mislyktes med nyere Cython versjoner
- bygget ved hjelp Cython 0.20.1
Hva er nytt i versjon 1.6:
- vesentlig raskere automat bygningen
- ikke lenger omfatter .hg repo i kildedistribusjonen
- bygget ved hjelp Cython 0,15 (RC0)
Hva er nytt i versjon 1.5:
- Cython utarbeidet NFS-to-DFA byggingen går vesentlig raskere
- alltid bygge tilleggsmoduler selv om Cython ikke er installert
- - ingen kompilere bryteren i setup.py å hindre utvidelse modul bygningen
- bygget ved hjelp Cython 0.14.1 (RC2)
Hva er nytt i versjon 1.4:
- minor speed-up i indre søkemotor sløyfe
- noen kode opprydding
- bygget ved hjelp Cython 0.12.1 (endelig)
Krav
- Python
Kommentarer ikke funnet