Track
/
Julia
Julia
/
Esercizi
/
Chatbot con espressioni regolari
Chatbot con espressioni regolari

Chatbot con espressioni regolari

Esercizio di apprendimento

Introduzione

Le espressioni regolari sono un modo estremamente versatile per fare pattern matching sulle stringhe, usando un linguaggio specifico del dominio (DSL) progettato proprio per questo scopo.

Come diversi altri linguaggi di programmazione, Julia non cerca di implementare una propria libreria di regex. Si limita invece a incapsulare la popolare libreria PCRE2, offrendo così una sintassi delle regex identica a quella di (per esempio) Gleam e molto simile a quella di Javascript.

Note

Questo programma di studio di Julia presuppone che tu abbia già familiarità con la sintassi di base delle regex. Ci concentreremo esclusivamente sulle funzionalità specifiche di Julia.

Qui sotto sono elencate alcune risorse per ripassare le espressioni regolari.

L'interfaccia di Julia alle espressioni regolari è descritta nel manuale.

In Julia, un'espressione regolare è semplicemente una stringa preceduta da r prima della " di apertura. Tutte le funzionalità di base fanno parte della libreria standard.

In realtà, molte delle funzioni già presentate nel concetto Strings sono pensate per le ricerche con le regex, come occursin().

julia> re = r"test$"
r"test$"

julia> typeof(re)
Regex

# Does a string end with "test"?
julia> occursin(re, "this is a test")
true

julia> occursin(re, "these are tests")
false

Dopo la virgoletta di chiusura possono seguire caratteri modificatori, come i per una corrispondenza che non distingue maiuscole e minuscole.

julia> occursin(r"test", "Testing")
false

julia> occursin(r"test"i, "Testing")
true

Gruppi di cattura

Spesso vogliamo sapere cosa corrisponde. Per farlo, si includono dei gruppi di cattura tra parentesi all'interno della regex e poi si usa la funzione match().

julia> m = match(r"(\d+g) .* (\d+ml)", "dissolve 25g sugar in 200ml water")
RegexMatch("25g sugar in 200ml", 1="25g", 2="200ml")

julia> m.captures
2-element Vector{Union{Nothing, SubString{String}}}:
 "25g"
 "200ml"

# how many matches?
julia> length(m.captures)
2

# what matched?
julia> m[1], m[2]
("25g", "200ml")

# Starting positions of the matches (character index)
julia> m.offsets
2-element Vector{Int64}:
 10
 23

Naturalmente, le corrispondenze possono fallire. In quel caso il risultato sarà il valore speciale Nothing invece di un RegexMatch, quindi preparati a verificarlo.

# failed match
m = match(r"(not here)", "dissolve 25g sugar in 200ml water")

julia> typeof(m)
Nothing

julia> isnothing(m)
true

Anche se match parte per impostazione predefinita dall'inizio della stringa, possiamo anche specificare un offset n per ignorare i primi n caratteri.

# capture first match
julia> m = match(r"(\wat)", "cat, sat, mat")
RegexMatch("cat", 1="cat")

# ignore first 5 characters, then match
julia> m = match(r"(\wat)", "cat, sat, mat", 5)
RegexMatch("sat", 1="sat")

In Julia, match() trova solo la prima corrispondenza nella stringa di destinazione: non esiste un modificatore globale come in altri linguaggi.

Abbiamo invece eachmatch(), che restituisce un iteratore di corrispondenze. La valutazione è pigra, quindi potresti doverlo convertire nel formato che ti serve.

julia> matches = eachmatch(r"(\wat)", "cat, sat, mat")
Base.RegexMatchIterator{String}(r"(\wat)", "cat, sat, mat", false)

# convert to vector
julia> collect(matches)
3-element Vector{RegexMatch}:
 RegexMatch("cat", 1="cat")
 RegexMatch("sat", 1="sat")
 RegexMatch("mat", 1="mat")

# convert with comprehension
julia> [m.match for m in matches]
3-element Vector{SubString{String}}:
 "cat"
 "sat"
 "mat"

# broadcast an anonymous function
julia> (m -> m.match).(matches)
3-element Vector{SubString{String}}:
 "cat"
 "sat"
 "mat"

Sostituire

Un motivo comune per usare una regex è sostituire la corrispondenza con una stringa diversa.

La funzione replace() è stata presentata nel concetto Strings, con l'uso di stringhe letterali come criteri di ricerca. La stessa funzione può sfruttare tutta la potenza delle corrispondenze regex.

julia> replace("some string", r"[aeiou]" => "*")
"s*m* str*ng"

julia> replace("first second", r"(\w+) (?<agroup>\w+)" => s"\g<agroup> \1")
"second first"

Il secondo esempio qui sopra mostra come si possano usare nella sostituzione sia i gruppi di cattura numerati sia quelli con nome, all'interno di una stringa s" ".

Consulta il manuale per maggiori dettagli: è un argomento che riporta continuamente la maggior parte dei programmatori alla documentazione!

Istruzioni

Sei stato assunto come specialista di espressioni regolari in un'azienda che sta sviluppando un Chatbot.

Il progetto è in una fase di sviluppo molto iniziale, quindi la tua missione è usare le espressioni regolari per migliorare la capacità del chatbot di capire e generare linguaggio naturale.

Note

A scopo di apprendimento, risolvi queste attività usando le espressioni regolari.

Sappiamo che a volte sono possibili delle alternative (e che potrebbero persino essere più efficienti!)

1. Controlla che il comando sia valido

Oltre a essere intelligente, il Chatbot è anche un assistente leale.

Per chiedere qualcosa al chatbot, l'utente deve dire la parola «Chatbot» nella prima posizione del comando.

Non importa se la parola chiave è in MAIUSCOLO o in minuscolo. L'aspetto importante qui è la posizione della parola.

Implementa la funzione is_valid_command(), che aiuta il Chatbot a riconoscere quando l'utente sta dando un comando.

julia> is_valid_command("Chatbot, play a song from the 80's.")
True

julia> is_valid_command("Hey Chatbot, where is the closest pharmacy?")
False

julia> is_valid_command("CHATBOT, do you have a solution for this challenge?")
True

2. Rimuovi le emoji crittografate

Per il Chatbot è difficile capire come gli esseri umani usano le emoji per esprimere le proprie emozioni.

Quando il chatbot riceve i messaggi degli utenti, ogni emoji è rappresentata dalla parola «emoji» seguita dal suo numero id.

Implementa il metodo remove_emoji() in modo che prenda una stringa e rimuova tutta la crittografia delle emoji presenti nel messaggio.

Le righe che non contengono il testo delle emoji devono essere restituite senza modifiche.

Rimuovi solo la stringa dell'emoji. Non cercare di sistemare gli spazi bianchi.

julia> remove_emoji("I love playing videogames emoji3465 it's one of my hobbies")
"I love playing videogames  it's one of my hobbies"

3. Controlla che il numero di telefono sia valido

Dato che le funzionalità del chatbot si scaricano su un'app mobile, durante la conversazione si prevede che l'utente scriva un numero di telefono.

Il problema è che il chatbot sa leggere e convalidare solo un numero con un formato specifico.

Se il numero è valido (corrisponde alla sequenza di caratteri specificata dall'espressione regolare), il chatbot risponde con un messaggio che ringrazia l'utente e conferma il numero. Se il numero non è valido, la funzione informa l'utente che il numero di telefono non è valido.

Il formato previsto è: (+##) ###-###-###

julia> check_phone_number("(+34) 659-771-594")
"Thanks! You can now download me to your phone."

julia> check_phone_number("659-771-594")
"Oops, it seems like I can't reach out to 659-771-594"

Il Chatbot è un software davvero curioso. Anche se può cercare su internet informazioni su un argomento specifico, preferisce chiedere agli utenti siti web o URL interessanti per trovare le informazioni che cerca.

Esempio di conversazione:

  • Chatbot: Ehi username, vorrei imparare a programmare in JavaScript, conosci qualche bel sito web dove potrei imparare?
  • User: Ho imparato molto da exercism.org

Implementa la funzione getURL(), che restituisce un array contenente solo il link di ciascun sito web.

julia> getURL("I learned a lot from exercism.org")
["exercism.org"]

5. Saluta l'utente

Per conservare i dati di tutte le persone che hanno conversato con lui, il chatbot è in grado di ricavare il nome completo dal profilo dell'utente, in questo formato: «smith, john».

Così facendo, vogliamo che il nostro chatbot sia davvero gentile e faccia una buona impressione.

Scrivi la funzione nice_to_meet_you() che prende una stringa con il nome completo dell'utente e restituisce la stringa «Nice to meet you, John Smith»

julia> str = "Smith, John"

julia> nice_to_meet_you(str)
"Nice to meet you, John Smith"
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Julia Exercism

Vuoi iniziare Chatbot con espressioni regolari?

Iscriviti a Exercism per imparare e padroneggiare Julia con 35 concetti128 esercizi e il mentoring di persone reali, tutto gratis.