Textverarbeitung
Das Modul text stellt reguläre Ausdrücke, Textvergleiche und Patches sowie das Aufteilen von Dokumenten bereit. Diese Seite ist eine API-Referenz. Die kurzen Blöcke sind einzelne Aufrufe; längere Blöcke zum Aufteilen sind Teilrezepte, deren Dokumente, konfigurierte Dateisystemressourcen und nachgelagerte Verarbeitung von der umgebenden Anwendung bereitgestellt werden.
Laden
local text = require("text")
Reguläre Ausdrücke
text.regexp.compile
local re, err = text.regexp.compile("[0-9]+")
if err then
return nil, err
end
| Parameter | Typ | Beschreibung |
|---|---|---|
pattern |
string | RE2-kompatibles Regex-Muster |
Gibt zurück: Regexp, error
re:match_string
local ok = re:match_string("abc123")
| Parameter | Typ | Beschreibung |
|---|---|---|
s |
string | Zu matchender String |
Gibt zurück: boolean
re:find_string
local match = re:find_string("abc123def")
| Parameter | Typ | Beschreibung |
|---|---|---|
s |
string | Zu durchsuchender String |
Gibt zurück: string | nil
In dieser Runtime-Version wird auch ein Treffer auf die leere Zeichenkette als nil dargestellt. Verwenden Sie ein Muster, das mindestens ein Zeichen verbraucht, wenn Sie einen leeren Treffer von keinem Treffer unterscheiden müssen.
re:find_all_string
local matches = re:find_all_string("a1b2c3")
| Parameter | Typ | Beschreibung |
|---|---|---|
s |
string | Zu durchsuchender String |
Gibt zurück: string[]
re:find_string_submatch
local match = re:find_string_submatch("user@example.com")
| Parameter | Typ | Beschreibung |
|---|---|---|
s |
string | Zu durchsuchender String |
Gibt zurück: string[] | nil (vollständiger Match + Capture-Gruppen)
re:find_all_string_submatch
local matches = re:find_all_string_submatch("a=1 b=2")
| Parameter | Typ | Beschreibung |
|---|---|---|
s |
string | Zu durchsuchender String |
Gibt zurück: string[][]
re:find_string_index
local pos = re:find_string_index("abc123")
| Parameter | Typ | Beschreibung |
|---|---|---|
s |
string | Zu durchsuchender String |
Gibt zurück: table | nil ({start, end}, 1-basiert)
re:find_all_string_index
local positions = re:find_all_string_index("a1b2c3")
| Parameter | Typ | Beschreibung |
|---|---|---|
s |
string | Zu durchsuchender String |
Gibt zurück: table[] | nil (nil, wenn es keine Treffer gibt)
re:replace_all_string
local result = re:replace_all_string("a1b2", "X")
| Parameter | Typ | Beschreibung |
|---|---|---|
s |
string | Eingabe-String |
repl |
string | Ersetzungs-String |
Gibt zurück: string
re:split
local parts = re:split("a,b,c", -1)
| Parameter | Typ | Beschreibung |
|---|---|---|
s |
string | Zu teilender String |
n |
integer | Max Teile, -1 für alle |
Gibt zurück: string[]
re:num_subexp
local count = re:num_subexp()
Gibt zurück: number
re:subexp_names
local names = re:subexp_names()
Gibt zurück: string[]
re:string
local pattern = re:string()
Gibt zurück: string
Text-Diffing
Vergleichen Sie Textversionen und erzeugen Sie Patches mit go-diff, einer Implementierung von Googles diff-match-patch-Algorithmus.
text.diff.new
local diff, err = text.diff.new()
local diff, err = text.diff.new(options)
Gibt zurück: Differ, error
Optionen {id="diff-options"}
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
diff_timeout |
number | 1.0 | Timeout in Sekunden |
diff_edit_cost |
integer | 4 | Kosten einer leeren Bearbeitung |
match_threshold |
number | 0.5 | Match-Toleranz 0-1 |
match_distance |
integer | 1000 | Distanz zur Match-Suche |
patch_delete_threshold |
number | 0.5 | Lösch-Schwelle |
patch_margin |
integer | 4 | Kontext-Rand |
diff:compare
Unterschiede zwischen zwei Texten finden. Gibt ein Array von Operationen zurück, die beschreiben, wie text1 in text2 transformiert wird.
local diff, diff_err = text.diff.new()
if diff_err then
return nil, diff_err
end
local diffs, err = diff:compare("hello world", "hello there")
if err then
return nil, err
end
-- diffs contains:
-- {operation = "equal", text = "hello "}
-- {operation = "delete", text = "world"}
-- {operation = "insert", text = "there"}
| Parameter | Typ | Beschreibung |
|---|---|---|
text1 |
string | Original-Text |
text2 |
string | Modifizierter Text |
Gibt zurück: table, error (Array von {operation, text})
Operationen: "equal", "delete", "insert"
diff:summarize
Zählen Sie unveränderte, eingefügte und gelöschte UTF-8-Bytes. Bei Nicht-ASCII-Text entsprechen diese Summen weder Unicode-Codepoints noch Graphemclustern.
-- `diffs` is the checked result from diff:compare.
local summary = diff:summarize(diffs)
-- summary.equals = 6 (bytes unchanged)
-- summary.deletions = 5 (bytes removed)
-- summary.insertions = 5 (bytes added)
| Parameter | Typ | Beschreibung |
|---|---|---|
diffs |
table | Diff-Array von compare |
Gibt zurück: table ({insertions, deletions, equals})
diff:pretty_text
Diff mit ANSI-Farben für Terminal-Anzeige formatieren.
local formatted, err = diff:pretty_text(diffs)
if err then
return nil, err
end
print(formatted)
| Parameter | Typ | Beschreibung |
|---|---|---|
diffs |
table | Diff-Array von compare |
Gibt zurück: string, error
diff:pretty_html
Diff als HTML mit <del>- und <ins>-Tags formatieren.
local html, err = diff:pretty_html(diffs)
if err then
return nil, err
end
-- `html` is an HTML fragment with equal, deleted, and inserted spans.
| Parameter | Typ | Beschreibung |
|---|---|---|
diffs |
table | Diff-Array von compare |
Gibt zurück: string, error
diff:patch_make
Patches generieren, die angewendet werden können, um einen Text in einen anderen zu transformieren. Patches können serialisiert und später angewendet werden.
local text1 = "The quick brown fox jumps over the lazy dog"
local text2 = "The quick red fox jumps over the lazy cat"
local patches, err = diff:patch_make(text1, text2)
if err then
return nil, err
end
| Parameter | Typ | Beschreibung |
|---|---|---|
text1 |
string | Original-Text |
text2 |
string | Modifizierter Text |
Gibt zurück: table, error
diff:patch_apply
Patches anwenden, um Text zu transformieren. Gibt das Ergebnis und ob alle Patches erfolgreich angewendet wurden zurück.
local result, success = diff:patch_apply(patches, text1)
-- result = "The quick red fox jumps over the lazy cat"
-- success = true
| Parameter | Typ | Beschreibung |
|---|---|---|
patches |
table | Patches von patch_make |
text |
string | Text, auf den Patches angewendet werden |
Gibt zurück: string, boolean
Prüfen Sie success, bevor Sie result als die angeforderte Transformation behandeln. Übergeben Sie Patch-Tabellen, die von patch_make erzeugt wurden. In dieser Runtime-Version kann fehlerhafter serialisierter Patch-Text in einer manuell erstellten Tabelle übersprungen werden, ohne dass dies separat gemeldet wird.
Text-Splitting
Große Dokumente in kleinere Chunks aufteilen, während semantische Grenzen erhalten bleiben. Basiert auf langchaingo Text-Splitter.
text.splitter.recursive
Der rekursive Splitter versucht nacheinander doppelte Zeilenumbrüche, einzelne Zeilenumbrüche, Leerzeichen und schließlich einzelne Zeichen. Er wechselt zum nächsten Trennzeichen, wenn ein Abschnitt die Größenbegrenzung überschreitet.
local splitter, err = text.splitter.recursive({
chunk_size = 1000,
chunk_overlap = 100
})
if err then
return nil, err
end
local long_text = "This is a long text that needs splitting..."
local chunks, split_err = splitter:split_text(long_text)
if split_err then
return nil, split_err
end
Gibt zurück: Splitter, error
Optionen {id="recursive-splitter-options"}
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
chunk_size |
integer | 4000 | Max Zeichen pro Chunk |
chunk_overlap |
integer | 200 | Zeichen wiederholt zwischen benachbarten Chunks |
keep_separator |
boolean | false | Trennzeichen in Ausgabe behalten |
separators |
string[] | nil | Benutzerdefinierte Trennzeichenliste |
text.splitter.markdown
Der Markdown-Splitter kann Überschriften mit ihrem Inhalt zusammenhalten, Codeblöcke bewahren und Tabellenzeilen gruppieren.
local splitter, err = text.splitter.markdown({
chunk_size = 2000,
code_blocks = true,
heading_hierarchy = true
})
if err then
return nil, err
end
local readme = fs.get("app:docs"):readfile("README.md")
local chunks, err = splitter:split_text(readme)
Dieses Teilrezept setzt voraus, dass der Eintrag sowohl text als auch fs aktiviert, eine Dateisystemressource app:docs konfiguriert ist und darin eine lesbare README.md vorhanden ist.
Gibt zurück: Splitter, error
Optionen {id="markdown-splitter-options"}
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
chunk_size |
integer | 4000 | Max Zeichen pro Chunk |
chunk_overlap |
integer | 200 | Zeichen wiederholt zwischen benachbarten Chunks |
code_blocks |
boolean | false | Code-Blöcke zusammenhalten |
reference_links |
boolean | false | Referenz-Links erhalten |
heading_hierarchy |
boolean | false | Überschriftenebenen beachten |
join_table_rows |
boolean | false | Tabellenzeilen zusammenhalten |
separators |
string[] | nil | Benutzerdefinierte Trennzeichenliste |
splitter:split_text
Einzelnes Dokument in Array von Chunks aufteilen.
local chunks, err = splitter:split_text(document)
if err then
return nil, err
end
for i, chunk in ipairs(chunks) do
-- Process each chunk (e.g., create embedding, send to LLM)
process(chunk)
end
Hier ist splitter ein erfolgreich erstellter Splitter; document und process werden von der Anwendung bereitgestellt.
| Parameter | Typ | Beschreibung |
|---|---|---|
text |
string | Zu teilender Text |
Gibt zurück: string[], error
splitter:split_batch
Mehrere Dokumente teilen, während ihre Metadaten erhalten bleiben. Jedes Eingabedokument kann mehrere Ausgabe-Chunks produzieren. Alle Chunks erben die Metadaten ihres Quelldokuments.
-- Input: pages from a PDF with page numbers
local pages = {
{content = "First page content...", metadata = {page = 1}},
{content = "Second page content...", metadata = {page = 2}}
}
local chunks, err = splitter:split_batch(pages)
if err then
return nil, err
end
-- Output: each chunk knows which page it came from
for _, chunk in ipairs(chunks) do
print("Page " .. chunk.metadata.page .. ": " .. chunk.content:sub(1, 50))
end
| Parameter | Typ | Beschreibung |
|---|---|---|
pages |
table | Array von {content, metadata} |
Gibt zurück: table, error (Array von {content, metadata})
split_batch überspringt ein Element stillschweigend, wenn es keine Tabelle ist, sein Feld content fehlt, leer oder keine Zeichenkette ist oder das Aufteilen dieses Elements fehlschlägt. Die Methode gibt die verbleibenden Abschnitte dennoch mit einem nil-Fehler zurück. Validieren Sie jedes Eingabeelement vor dem Aufruf und prüfen Sie Anforderungen an die Anzahl der Ergebnisse im Anwendungscode; ein erfolgreicher Aufruf belegt nicht, dass jede Eingabe vertreten ist.
Fehler
| Bedingung | Art | Wiederholbar |
|---|---|---|
| Ungültige Muster-Syntax | errors.INVALID |
nein |
| Interner Fehler | errors.INTERNAL |
nein |
Informationen zum Umgang mit Fehlern finden Sie unter Fehlerbehandlung.