Săptămâna aceasta mi-am făcut timp să recitesc Creierul programatorului de Felienne Hermans. Printre multele pietre prețioase, o idee care mi-a rămas în minte este că a nu învăța cum să faci ceva și a-l căuta de fiecare dată te va face mai puțin eficient. Prin urmare, încep să mă simt rău în legătură cu un anumit lucru pe care nu îl fac niciodată singur: extragerea unor părți dintr-un șir, chiar și în cazuri simple.
Tactici de evitare
De exemplu, cum extrageți nume din următoarele propoziții șablon?
sentences <- c(
"My name is Moomin.",
"My name is Little My.",
"My name is Snork Maiden."
)
Aș folosi oricare dintre aceste două tactici:
- Eliminarea punctului final și a primelor cuvinte.
sub("My name is ", "", sub(".$", "", sentences))
#> (1) "Moomin" "Little My" "Snork Maiden"
- Căutând sintaxa regex online (poate chiar citind cu atenție foaia stringr) sau printr-un LLM. Acest lucru m-ar putea obține codul de apel stringr:
stringr::str_extract(sentences, "My name is (.*).", group = 1)
#> (1) "Moomin" "Little My" "Snork Maiden"
# Look arounds
stringr::str_extract(sentences, pattern = '(?<=My name is ).+(?=\.)')
#> (1) "Moomin" "Little My" "Snork Maiden"
Sau un cod R de bază:
regmatches(
sentences,
regexpr("(?<=My name is ).+(?=\.)", sentences, perl = TRUE)
)
#> (1) "Moomin" "Little My" "Snork Maiden"
Problemele mele
Într-adevăr, am avut două probleme care mă împiedicau să fiu cu adevărat autonom:
- Nu cunoaște suficient regex.
- Neștiind unde să pun regex, din orice motiv am simțit că trebuie să aleg între a adăuga o dependență de stringr sau a folosi sintaxa complicată regexpr/regmatches în doi pași.
Soluții
Pentru a rezolva prima problemă (lipsa cunoștințelor regex), trebuie să fiu mai intenționat să-mi amintesc de exemplu sintaxa privirii în jur sau ce este un grup.
Ceea ce mi-a rezolvat a doua problemă (crezând că trebuie să aleg între o dependență sau un cod neplăcut pentru mine) a fost un sfat foarte simplu de la colegul meu de rOpenSci, Jeroen Ooms: folosirea sub()! Codul de mai jos înlocuiește propozițiile cu numele (grupurile de captură) din ele.
sub("My name is (.*).", "\1", sentences)
#> (1) "Moomin" "Little My" "Snork Maiden"
Acesta este codul pe care pare să-l folosească destul de des.
Ceea ce a fost deosebit de grozav la acest sfat, pe lângă momentul în care am citit cartea, este că m-a făcut să „obțin” grupuri mai ușor. Grupul este ceea ce este între paranteze, nu e mai complicat decât atât (cel puțin nu trebuie să știu mai multe acum).
Concluzie
Voi încerca să fiu atent să nu fiu prea leneș să învăț unele lucruri atunci când le pot învăța. Și acum știu că pot folosi altceva decât stringr sau sintaxa R de bază, nu atât de simplă regmatches(): un simplu apel la sub()! Urmărește-mă că câștig secunde de fiecare dată când trebuie să extrag părți dintr-un șir. 😁
