13.5 Modifikace chování regulárních výrazů
Chování regulárních výrazů je možné ve funkcích z balíku stringr modifikovat pomocí čtyř funkcí: regex()
, fixed()
, coll()
a boundary()
. Nejdůležitější z nich je funkce regex()
. Pokaždé, když zadáte regulární výraz, funkce z balíku stringr na něj tiše uplatní funkci regex()
, takže dva následující výrazy jsou zcela ekvivalentní:
<- c("máma", "Máma", "MÁMA")
s1 str_detect(s1, "(.)á\\1a")
## [1] TRUE FALSE FALSE
str_detect(s1, regex("(.)á\\1a"))
## [1] TRUE FALSE FALSE
Funkce regex()
umožňuje poněkud modifikovat chování regulárního výrazu. K tomu jí slouží čtyři parametry. Parametr ignore_case
umožňuje vypnout rozdíl mezi malými a velkými písmeny (case sensitivity):
str_detect(s1, regex("(.)á\\1a", ignore_case = TRUE))
## [1] TRUE TRUE TRUE
Normálně v regulárních výrazech v balíku stringr znamenají znaky ^
a $
začátek a konec řetězce. Pokud mají znamenat začátek a konec řádku (což je obvyklejší), je třeba použít parametr multiline
:
<- "1. nakoupíš 7 vajec.\n2. umyješ podlahu\n3. nakrmíš králík"
s2 cat(s2)
## 1. nakoupíš 7 vajec.
## 2. umyješ podlahu
## 3. nakrmíš králík
str_extract_all(s2, "^\\d+\\.")
## [[1]]
## [1] "1."
str_extract_all(s2, regex("^\\d+\\.", multiline = TRUE))
## [[1]]
## [1] "1." "2." "3."
Zbývající dva parametry jsou méně důležité: parametr dotall
způsobí, že .
zahrne všechny znaky, včetně konce řádku \n
. Parametr comments
umožňuje přidávat do regulárního výrazu komentáře.
Alternativou funkce regex()
je funkce fixed()
. Ta zajistí, že se výraz bere doslovně. Řekněme, že chceme spočítat počet souvětí v řetězci a že počet souvětí aproximujeme počtem teček (naše souvětí vždy končí tečkou, ne vykřičníkem nebo otazníkem, a text neobsahuje žádné zkratky, pořadová čísla ani tečky nevyužívá nijak jinak než na konci vět). Abychom našli všechny výskyty tečky v řetězci, můžeme ji buď zbavit speciálního významu pomocí zpětného lomítka, nebo použít funkci fixed()
:
<- "Máma má máso. Ema má mísu. Ó my se máme."
s3 str_count(s3, "\\.")
## [1] 3
str_count(s3, fixed("."))
## [1] 3
Podobně jako regex()
je i ve funkci fixed()
možné vypnout rozdíl mezi malými a velkými písmeny pomocí parametru ignore_case
.
Funkce fixed()
porovnává řetězec doslovně, takže znaky bere doslovně jako byty, což nemusí vždy správně fungovat pro znaky, které nejsou součástí kódu ASCII (zhruba pro znaky, které nejsou součástí anglické abecedy). Pokud chceme takové znaky brát doslovně, je potřeba použít funkci cols()
, které je navíc možné nastavit locale jazyka (implicitní jazyk je angličtina).
Poslední funkce pro modifikaci chování regulárních výrazů je funkce boundary()
, která umožňuje nastavit okraje regulárního výrazu. Platné volby jsou “character,” “line_break,” “sentence” a “word”). Nejužitečnější je boundary("word")
, které hledá hranice mezi slovy:
<- "Svítilo zářilo zlaté slunce na pobřeží na lagunce."
s4 str_split(s4, boundary("word"))
## [[1]]
## [1] "Svítilo" "zářilo" "zlaté" "slunce" "na" "pobřeží" "na"
## [8] "lagunce"
str_extract_all(s4, boundary("word"))
## [[1]]
## [1] "Svítilo" "zářilo" "zlaté" "slunce" "na" "pobřeží" "na"
## [8] "lagunce"