9 Regular expression ja find & replace

Regular expression annab võimaluse lühidalt kirjeldada mitte-üheseid otsinguparameetreid.

regular expression on string, mis kirjeldab mitut stringi

A regular expression Regular Expressions as used in R

string on märkide järjestus, mis on jutumärkide vahel (“” või ’’). Osad märgid ei ole R stringis otse representeeritavad. Neid representeerivad nn special characters ehk erimärgid. Iga kord kui te regular expressionis näete  peate seda stringis, mis representeerib seda rexexp-i, kirjutama kui \.

writeLines() näitab kuidas R näeb su stringi peale seda, kui erimärgid on välja loetud (parsitud).

writeLines("\\.") # \.
writeLines("\\ is a backslash") # \ is a backslash

Enamus märke (k.a. tähed ja numbrid) tähistavad ainult iseennast.

  • . tähistab igat märki.

Märgiklass on märkide nimekiri nurksulgude vahel, nagu näiteks [[:alnum:]], mis on sama kui [A-z0-9]. Enamasti tuleb need stringi kirjutada topelt nurksulgudes: [[:siia_märgiklass:]]. Aga näiteks [0-9] on üksik nurksulgudes.

  • tavalised märgiklassid:
  • [:alnum:] numbrid ja tähed: AacF123
  • [:digit:] numbrid: 123
  • [:alpha:] tähed: asdf
  • [:upper:] suured tähed: ASDF
  • [:lower:] väiksed tähed: asdf
  • [:punct:] ! " # $ % & ’ ( ) * + , - / : ; < = > ? @ [  ] ^ _ ` ` { | } ~.
  • [:space:] space, tab ja newline.
  • [:blank:] tab ja newline.

Metamärgid on . \ | ( ) [ { ^ $ * + ?. Nende tähendus sõltub kontekstist. \\ teeb metamärgist tavalise märgi.


trüki see   regex
\\n         \n   new line (return)
\\t         \t   tab
\\s         \s   any whitespace (\S - any non-whitespace)
\\d         \d   any digit (\D - any non-digit) 
\\w         \w   any word character (\W - non-word char)
\\b         \b   word boundaries

Selleks, et trükkida erimärk tavalise märgina:
  
trüki  selleks  
\\.    .
\\!    !
\\?    ?        
\\\\   \
\\(    (
\\{    {
  • Repetition quantifiers put after regex specify how many times regex is matched: ?, zero or one; *, zero or more times; +, one or more times; {n}, n times; {n,}, n or more times; {n,m}, n to m times.
  • ^ anchors the regular expression to the start of the string.
  • $ anchors the the regular expression to end of the string.

  • ab|d tähendab ab või d
  • [abe] tähendab ühte kolmest (kas a või b või e)
  • [^abe] tähendab kõike, mis ei ole a või b või e
  • [a-c] tähendab a või b või c

Sulud annavad eelistuse

  • (ab|d)e tähendab abe või de

Leia string, millele järgneb või eelneb mingi string

  • a(?=c) annab need a-d, millele järgneb c
  • a(?!c) annab need a-d, millele ei järgne c
  • (?<=b)a annab need a-d, millele eelneb b
  • (?<!b)a annab need a-d, millele ei eelne b

patterns that match more than one character:


. (dot): any character apart from a newline.

\\d: any digit.

\\s: any whitespace (space, tab, newline).

\[abc]: match a, b, or c.

\[!abc]: match anything except a, b, or c.

To create a regular expression containing \d or \s, you???ll need to escape the \ for the string, so you will type "\\\\d" or "\\\\s".

abc|d..f will match either "abc", or "deaf". 

Et mitte interpreteerida stringi tavalise regex-ina: regex(pattern, ignore_case = FALSE, multiline = FALSE, comments = FALSE, dotall = FALSE, ...) ignore cases, match end of lines and end of strings, allow R comments within regex’s , and/or to have . match everything including \n. Näiteks str_detect("I", regex("i", TRUE))

9.1 Common operations with regular expressions

  • Locate a pattern match (positions)
  • str_detect() annab TRUE/FALSE
  • str_which() annab stringide, mis sisaldavad otsingumustrit, indeksinumbrid
  • str_count() annab esinemiste arvu stringis
  • str_locate_all() annab otsingumustri positsiooninumbri (indeksi) stringis

  • Extract a matched pattern
  • str_sub() võtab välja otsitud alamstringi; otsing indeksinumbrite järgi
  • str_subset() võtab välja terve stringi; regex otsing
  • str_extract_all() võtab välja mustri (alamstringi); regex otsing
  • str_match_all() annab maatriksi, millel on veerg igale grupile regeximustris

  • Replace a matched pattern
  • str_replace_all()
  • str_to_lower()
  • str_to_upper()
  • str_to_title()

  • stringi pikkus
  • str_length() annab märkide arvu stringis
  • str_trim() võtab maha whitespace stringi algusest/lõpust

  • ühenda ja eralda stringe
  • str_c() ühendab, k.a. kollapseerib mitu stringi üheks (arg collapse=)
  • str_dup() kordab stringi n korda
  • str_split_fixed() jagab stringi alamstringide maatriksiks
  • glue::glue_data() teeb stringi df-st, listist v environmentist

  • järjesta stringe
  • str_sort() annab sorditud character vectori

9.2 Find and replace

library(stringr)
x<- c("apple", "ananas", "banana")

#replaces all a-s at the beginning of strings with e-s
str_replace(x, "^a", "e") 
#> [1] "epple"  "enanas" "banana"

# str_replace only replaces at the first occurence at each string
str_replace(x, "a", "e") 
#> [1] "epple"  "enanas" "benana"

#str_replace_all replaces all a-s anywhere in the strings
str_replace_all(x, "a", "e") 
#> [1] "epple"  "enenes" "benene"

#replaces a and the following character at the end of string with nothing (i.e. deletes 2 chars)
str_replace(x, "a.$", "")
#> [1] "apple"  "anan"   "banana"

#replaces a-s or s-s at the end of string with e-s
str_replace(x, "(a|s)$", "e")
#> [1] "apple"  "ananae" "banane"

#replaces a-s or s-s anywhere in the string with e-s
str_replace_all(x, "a|s", "e")
#> [1] "epple"  "enenee" "benene"

#remove all numbers. 
y<-c("as1", "2we3w", "3e")
str_replace_all(y, "\\d", "") 
#> [1] "as"  "wew" "e"

#remove everything, except numbers. 
str_replace_all(y, "[A-Za-z_]", "") 
#> [1] "1"  "23" "3"
x<- c("apple", "apple pie")
str_replace_all(x, "^apple$","m") #To force to only match a complete string:
#> [1] "m"         "apple pie"
str_replace_all(x, "\\s","_") #space to _
#> [1] "apple"     "apple_pie"
str_replace_all(x, "[apl]","_") #a or p or l to _
#> [1] "____e"     "____e _ie"
str_replace_all(x, "[ap|p.e]","_") # ap or p.e to _
#> [1] "___l_"     "___l_ _i_"

näide: meil on vector v, milles täht tähistab katse tüüpi, number, mis on tähe ees, tähistab mõõtmisobjekti identiteeti ja tähe järel asuv number tähistab ajapunkti tundides (h). F ja f tähistavad sama asja. Kõigepealt võtame välja F-i mõõtmisojbekti ehk subjekti koodid

library(stringr)
v <- c("1F1", "12F2h", "13f1", "2S")


v_f <- str_subset(v, "[Ff]") 
#filtreerime F ja f sisaldavad stringid
v_f
#> [1] "1F1"   "12F2h" "13f1"
v_f_subject <- str_replace_all(v_f, "[Ff][0-9]+h?", "") 
#string "F või f, number üks või enam korda, h 0 või enam korda" asendada tühja stringiga
v_f_subject
#> [1] "1"  "12" "13"

Ja nääd võtame välja ajapunktide koodid. Kõigepealt asendame stringid, mis sisaldavad vähemalt üht numbrit, millele järgneb F v f tühja stringiga. Seejärel asendame tühja stringiga h-d. Ja lõpuks avaldame iga ajapunkti numbrina (mitte enam stringina).

library(tidyverse)
str_replace_all(v_f, "[0-9]+[Ff]", "") %>% str_replace_all("h", "") %>% as.integer
#> [1] 1 2 1