(Этот ответ не имеет ничего общего с регулярными выражениями, но охватывает некоторые варианты использования.)
Я не знаю, работает ли это для вашего варианта использования. Но похоже, что вы пытаетесь найти, есть ли в вашем тексте слово (или близкая к нему опечатка). Если текст разделен пробелами, а ваше слово не содержит пробелов, вы можете попробовать что-то вроде:
nopunct(s) = filter(c -> !ispunct(c), s)
nfcl(s) = normalize_string(s, decompose=true, compat=true, casefold=true,
stripmark=true, stripignore=true)
canonicalize(s) = nopunct(nfcl(s))
fuzzy(needle, haystack, n) = any(
w -> levenshtein(w, canonicalize(needle)) < n,
split(canonicalize(haystack)))
Что это делает, примерно:
nfcl
нормализует строки с похожим «человеческим» внешним видом, удаляя диакритические знаки, игнорируя регистр и выполняя нормализацию Unicode. Это очень полезно для нечеткого сопоставления:
julia> nfcl("Ce texte est en français.")
"ce texte est en francais."
nopunct
убирает знаки препинания, еще больше упрощая строку.
julia> nopunct("Hello, World!")
"Hello World"
canonicalize
просто объединяет эти два преобразования.
Затем мы проверяем, находятся ли какие-либо слова в стоге сена (разделенные пробелами) в пределах n
от иголки.
Примеры:
julia> fuzzy("Robert", "My name is robrt.", 2)
true
julia> fuzzy("Robert", "My name is john.", 2)
false
Это ни в коем случае не полное решение, но оно охватывает множество распространенных вариантов использования. Для более продвинутых вариантов использования следует более подробно изучить тему.
person
Fengyang Wang
schedule
21.06.2016