Regexp-Kurs_02.R
von tegula- SNIPPET_DESC:
- Bitte Dateinamensendung ".txt" entfernen.
- SNIPPET_CREATION_TIME:
- 13.04.2022 17:04:43
- SNIPPET_PRUNE_TIME:
- Unendlich
- SNIPPET_TEXT:
-
- #' ---
- #' title: "Lösungsversuch zum RegEXP-Kurs im Debianforum"
- #' author: "tegula"
- #' date: "10 4 2022"
- #' output: html_document
- #' ---
- #' ------------------------
- #' ------------------------
- #' **Kurs-Teil:** 02 - Metazeichen & Escaping (09.04.2022)
- #' **URL:** https://debianforum.de/forum/viewtopic.php?t=183974
- #' ------------------------
- #' ------------------------
- #' Vorbereitung --> Zusätzliche Packages laden:
- library(magrittr) # für Pipe-Operator
- library(stringr) # für das "Zerstückeln" der Zeichenketten
- library(docstring) # für Beschreibung bzw. Kurzhilfe der selbstdefinierten Funktionen
- #' ------------------------
- #' ------------------------
- # Aufgabe 1) Das Escapezeichen ist der Unterstrich (_). Literale Zeichen sind die Standardzeichen. Schreibe den Ausdruck fuer das literale Wort: ``Haus''.
- #' **Antwort:** Haus
- #' ------------------------
- #' ------------------------
- # Aufgabe 2) Das Escapezeichen ist der Unterstrich (_). Metazeichen sind die Standardzeichen. Schreibe den Ausdruck fuer das literale Wort: ``Haus''.
- #' **Antwort:** _H_a_u_s
- #' ------------------------
- #' ------------------------
- # Aufgabe 3) Das Escapezeichen ist das grosse X. Metazeichen sind die Standardzeichen. Schreibe den Ausdruck fuer das literale Wort: ``Haus''.
- #' **Antwort:** XHXaXuXs
- #' ------------------------
- #' ------------------------
- ## Aufgabe 4) Das Escapezeichen ist das kleine a. Literale Zeichen sind die Standardzeichen. Schreibe den Ausdruck fuer das literale Wort: ``Haus'
- #' **Antwort:** aHaaauas
- #' ------------------------
- #' ------------------------
- ## Aufgabe 5.) Suche dir ein Escapezeichen aus. Literale Zeichen sind die Standardzeichen. Schreibe die Zeichenfolge: Literales `D', literales 'F', literales `D', literales 'E', Metazeichen `J', literales `R', literales `E', literales `s', literales `!', Metazeichen `J', Metazeichen `@'.
- #' **Gewähltes Escapezeichen**: _Einfaches_ Escapezeichen (im R-Script doppelt geschrieben, damit bei Generierung des Reports (R-Markdown-Dokument) (einfach statt gar nicht) angezeigt wird.
- #' **Antwort:** DFDE\\JREs!\\J\\@
- #' ------------------------
- #' ------------------------
- ## Aufgabe 6) Schreibe den gleichen Text aus (5) [Aufgabe 5] aber mit Metazeichen als Standardzeichen.
- #' **Antwort:** \\D\\F\\D\\EJ\\R\\E\\s\\J@
- #' ------------------------
- #' ------------------------
- ## Aufgabe 7) Das Escapezeichen ist die oeffnende runde Klammer (`('). Suche dir aus, welche Zeichenart die Standardzeichen sind. Schreibe einen Ausdruck mit nur oeffnenden und schliessenden runden Klammern und erklaere ihn anschliessend
- #' **Antwort:**
- #' * Standardzeichen = Literale Zeichen
- #' * Es ergibt sich folgende Zeichenkette: "(())". Gelesen von links nach rechts: [Klammer auf als Escapezeichen], Klammer auf, [Klammer auf als Escapezeichen], Klammer auf, Klammer zu, Klammer zu".
- #' ------------------------
- #' ------------------------
- ## Aufgabe 8) Das Escapezeichen ist das Komma (,). Literale Zeichen sind die Standardzeichen. Beschreibe den Ausdruck (vgl. (5)): ``A,BCD,E,FG,,H''
- #' **ANTWORT**
- #' * __Von links nach rechts (komplette Zeichenkette, einschließlich Metazeichen):__ literales Zeichen "A", Metazeichen "B", literales Zeichen "C", literales Zeichen "D", Metazeichen "E", Metazeichen "F", literales Zeichen G, Metazeichen ",", literales Zeichen H.
- #' * __"Lesbare" Zeichenkette (ohne Metazeichen):__ "ACDGH".
- #' ------------------------
- #' ------------------------
- # Aufgabe 9)Das Escapezeichen ist das Komma (,). Metazeichen sind die Standardzeichen. Beschreibe den Ausdruck: ``hello, world''
- #' **ANTWORT**
- #' * __Von links nach rechts (komplette Zeichenkette, einschließlich Metazeichen):__ Metazeichen "h", Metazeichen "e", Metazeichen "l", Metazeichen "l", Metazeichen "o", literales Zeichen " ", Metazeichen "w", Metazeichen "o", Metazeichen "r", Metazeichen "l", Metazeichen "d".
- #' * __"Lesbare" Zeichenkette (ohne Metazeichen):__ " ".
- #' ------------------------
- #' ------------------------
- # Aufgabe 10) Das Escapezeichen ist das kleine a. Literale Zeichen sind die Standardzeichen. Beschreibe den Ausdruck: ``Haus''
- #' **ANTWORT**
- #' * __Von links nach rechts (komplette Zeichenkette, einschließlich Metazeichen):__ Literales Zeichen "H", Metazeichen "u", literales Zeichen "s".
- #' * __"Lesbare" Zeichenkette (ohne Metazeichen):__ "Hs"
- #' ------------------------
- #' ------------------------
- # Aufgabe 11) Das Escapezeichen ist das kleine a. Literale Zeichen sind die Standardzeichen. Beschreibe den Ausdruck: ``Haaus''
- #' **ANTWORT**
- #' * __Von links nach rechts (komplette Zeichenkette, einschließlich Metazeichen):__ Literales Zeichen "H", Metazeichen a, literales Zeichen u, literales Zeichen s.
- #'* __"Lesbare" Zeichenkette (ohne Metazeichen):__ "Hus"
- #' ------------------------
- #' ------------------------
- # Aufgabe 12) Das Escapezeichen ist das kleine a. Metazeichen sind die Standardzeichen. Beschreibe den Ausdruck: ``Haaus''
- #' * __Von links nach rechts (komplette Zeichenkette, einschließlich Metazeichen):__ Metazeichen "H", literales Zeichen "a", Metazeichen "u", Metazeichen "s".
- #' * __"Lesbare" Zeichenkette (ohne Metazeichen):__ "a"
- #' ------------------------
- #' ------------------------
- # Aufgabe 13) Schreibe ein Programm, das literalen Text passend escapet. Das Escapezeichen und die Entscheidung, welche Zeichenart die Standardzeichen sind, sollen variabel sein (z.B. CLI-Argumente). Pruefe damit deine Loesungen fuer die Aufgaben (1) bis (7).
- #' **Funktion definieren:**
- escapen <- function(txt, escape, standard) {
- #' escapen
- #'
- #' Nimmt die Beschreibung eines regulären Ausdruck als character-Objekt (literales Wort) bzw. data.frame-Objekt (Beschreibung der im Ausdruck enthaltenen Zeichen, ihres Zeichentyp (Standardzeichen oder Metazeichen) sowie ihrer Reihenfolge) entgegen und gibt (abhängig von gewählten Escapezeichen) einen regulären Ausdruck (als Character-Objekt) zurück.
- #'
- #' @param txt Entweder ein chr-Obekt der Länge 1 (als Repräsentation eines (ausschließlich) literalen Worts) oder ein data.frame-Objekt (als Repräsentation eines Ausdrucks, welcher (gleichzeitig) sowohl literale Zeichen als auch Metazeichen enthalten kann). Wird ein data.frame-Objekte übergeben, so muss dieses zwingend die chr-Variablen (Spalten) 'zeichen' (--> erlaubte Werte: Genau ein (!) (beliebige) Zeichen) und 'typ' (--> erlaubte Werte: "literal" und "meta") enthalten. Jedes Zeichen des Ausdrucks muss durch genau einen Fall (Zeile) im data.frame-Objekt beschrieben werden.
- #' @param escape chr-Objekt der Länge 1: Escapezeichen.
- #' @param standard chr-Obekt der Länge 1: Entweder "literal" (Standardzeichen sind die literalen Zeichen) oder "meta" (Standardzeichen sind die Metazeichen).
- #' @return chr-Objekt der Länge 1: Regulärer Ausdruck, abhängig von {txt}, {escape} und {standard}.
- #' @examples escapen(txt = "hallo", escape = "X", standard = "meta") # Literales Wort ist "hallo". Escapezeichen ist das "X". Standardzeichen sind die Metazeichen.
- #' @export
- ## Fall 1: Alle Zeichen sind literale Zeichen (eigentlich: die Benutzereingabe ist eine Zeichenkette) & Standardzeichen = Metazeichen.
- ### --> Vor jedes Zeichen des literalen Worts wird das (im Funktionargument "escape" anzugebende) Escapezeichen eingefügt.
- if ((is.character(txt)) & (standard == "meta")) {
- txt %>%
- stringr::str_extract_all(pattern = "[:print:]", simplify = TRUE) %>%
- paste0(collapse = escape) %>%
- paste0(escape, .) %>%
- return() # "fertigen" regulären Ausdruck zurückgeben
- ### Fall 2: Alle Zeichen sind literale Zeichen (eigentlich: die Benutzereingabe ist eine Zeichenkette) & Standardzeichen = literale Zeichen.
- } else if ((is.character(txt)) & (standard == "literal")) {
- txt %>%
- stringr::str_extract_all(pattern = "[:print:]", simplify = TRUE) %>%
- paste0(collapse = "") %>%
- return() # "fertigen" regulären Ausdruck zurückgeben
- ## Fall 3: Zeichen gemischt (oder nur Metazeichen) & Standardzeichen = literale Zeichen.
- } else if ((is.data.frame(txt)) & standard == "literal") {
- ### Dem Datensatz (txt) wird eine zusätzliche (Character-)Variable (txt$escapezeichen) hinzugefügt. Ist das Zeichen ein Metazeichen, so wird der Variable txt$escapezeichen das Escapezeichen (Parameter "escape") zugewiesen. Ist das Zeichen ein literales Zeichen, so wird der Variable txt$escapezeichen eine leere Zeichenkette ("") zugewiesen.
- txt$escapezeichen <- ifelse(test = (txt$typ=="meta"),
- yes = escape,
- no = "")
- zeichenfolge <- ""
- ### Erzeugen des Regulären Ausdrucks. Hierzu wird mit einer leeren Zeichenfolge begonnen. Anschließend werden alle Zeilen des Datensatzes (txt) durchlaufen.
- for (i in seq(nrow(txt))) {
- zeichenfolge <- paste0(zeichenfolge,
- txt$escapezeichen[i],
- txt$zeichen[i])
- }
- ### "fertigen" regulären Ausdruck zurückgeben
- zeichenfolge %>% return()
- ## Fall 4: Zeichen gemischt oder nur Metazeichen (eigentlich: Benutzereingabe ist ein data.frame-Objekt) & Standardzeichen = Metazeichen.
- ### Dem Datensatz (txt) wird eine zusätzliche (Character-)Variable (txt$escapezeichen) hinzugefügt. Ist das Zeichen ein literales Zeichen, so wird der Variable txt$escapezeichen das Escapezeichen (Parameter "escape") zugewiesen. Ist das Zeichen ein Metazeichen, so wird der Variable txt$escapezeichen eine leere Zeichenkette ("") zugewiesen
- } else if ((is.data.frame(txt)) & standard == "meta") {
- txt$escapezeichen <- ifelse(test = (txt$typ == "literal"),
- yes = escape,
- no = "")
- ### Erzeugen des regulären Ausdrucks. Hierzu wird mit einer leeren zeichenfolge begonnen. Anschließend werden alle Zeilen des Datensatzes (txt) durchlaufen.
- zeichenfolge = ""
- for (i in seq(nrow(txt))) {
- zeichenfolge <- paste0(zeichenfolge,
- txt$escapezeichen[i],
- txt$zeichen[i])
- }
- ### "fertigen" regulären Ausdruck zurückgeben
- zeichenfolge %>% return()
- ### Sonstige Fälle: Treffen Fall 1-4 allesamt nicht zu, so wird Missing Value (NA) zurückgeben.
- } else {
- NA %>% return()
- }
- }
- #' **Lösungen überprüfen: --> Aufgabe 1:**
- escapen(txt = "Haus", escape = "_", standard = "literal")
- #' **Lösungen überprüfen --> Aufgabe 2:**
- escapen(txt = "Haus", escape = "_", standard = "meta")
- #' **Lösungen überprüfen --> Aufgabe 3:**
- escapen(txt = "Haus", escape = "X", standard = "meta")
- #' **Lösungen überprüfen --> Aufgabe 4:**
- escapen(txt = "Haus", escape = "X", standard = "meta")
- #' **Lösungen überprüfen --> Aufgabe 5:**
- #df_Aufgabe_5 <- edit(as.data.frame(NULL))
- #save(df_Aufgabe_5, file = "df_Aufgabe_5.RData", ascii = TRUE)
- load("df_Aufgabe_5.RData") # manuell eingetippte Daten laden
- df_Aufgabe_5 # manuell eingetippte Daten anzeigen
- escapen(txt = df_Aufgabe_5, escape = "\\", standard = "literal") # eigentliches Überprüfen der Lösung zu Aufgabe 5
- #' **Lösungen überprüfen --> Aufgabe 6:**
- escapen(txt=df_Aufgabe_5, escape = "\\", standard = "meta") # Gleiche Zeichen wie in Aufgabe 5. Einziger Unterschied: Standardzeichen sind die Metazeichen (statt der literalen Zeichen).
- #' **Lösungen überprüfen --> Aufgabe 7:**
- #df_Aufgabe_7 <- edit(as.data.frame(NULL))
- #save(df_Aufgabe_7, file = "df_Aufgabe_7.RData", ascii = TRUE)
- load("df_Aufgabe_7.RData") # manuell eingetippte Daten anzeigen
- df_Aufgabe_7 # manuell eingetippte Daten anzeigen
- escapen(txt = df_Aufgabe_7, escape = "(", standard = "literal") #eigentliches Überprüfen der Lösung zu Aufgabe 7
- # Aufgabe 14) Auf die vorigen Aufgabe aufbauend: Schreibe ein Programm, das den escapeten Text wieder einliest und eine sprachliche Beschreibung davon ausgibt, aehnlich wie in (5). Pruefe damit deine Loesungen fuer die Aufgaben (8) bis (12).
- #' **Funktion definieren:**
- beschreiben <- function(ausdruck, escape, standard) {
- #' beschreiben
- #'
- #' Liest ein Character-Objekt (als Repräsentation eines regulären Ausdrucks) ein und gibt (abhängig von der angegebenen Definition von Standard- und Escapezeichen) eine passende sprachliche Beschreibung (ebenfalls als Character-Objekt) zurück.
- #'
- #' @param ausdruck chr-Objekt der Länge 1: Regulärer Ausdruck.
- #' @param escape chr-Obejekt der Länge 1: Escapezeichen.
- #' @param standard chr-Obekt der Länge 1: Entweder "literal" (Standardzeichen sind die literalen Zeichen) oder "meta" (Standardzeichen sind die Metazeichen).
- #' @return chr-Objekt der Länge 1: Passende sprachliche Beschreibung von {ausdruck}, abhängig von {escape} und {standard}.
- #' @example beschreiben(ausdruck="ab?c", escape = "?", standard = "literal") # Regulärer Ausdruck ist"a?bc". Escapezeichen ist "?". Standardzeichen sind die literalen Zeichen.
- #' @export
- i = 1
- anzahl_zeichen = str_extract_all(string = ausdruck,
- pattern = "[:print:]",
- simplify = TRUE) %>% length()
- zeichenvektor = str_extract_all(str = ausdruck,
- pattern = "[:print:]",
- simplify = TRUE)
- zeichenfolge = ""
- while (i <= anzahl_zeichen) {
- if ((escape == zeichenvektor[i]) & (standard == "literal")) {
- zeichenfolge <- paste0(zeichenfolge,
- "Metazeichen ",
- zeichenvektor[i + 1],
- ". "
- )
- i = i + 2
- } else if ((escape == zeichenvektor[i]) & (standard == "meta")) {
- zeichenfolge <- paste0(zeichenfolge,
- "Literales Zeichen ",
- zeichenvektor[i + 1],
- ". ")
- i = i + 2
- } else if ((escape != zeichenvektor[i]) & (standard == "literal")) {
- zeichenfolge <- paste0(zeichenfolge,
- "Literales Zeichen ",
- zeichenvektor[i],
- ". ")
- i = i + 1
- } else if ((escape != zeichenvektor[i]) & (standard == "meta")) {
- zeichenfolge <- paste0(zeichenfolge,
- "Metazeichen ",
- zeichenvektor[i],
- ". ")
- i = i + 1
- } else {
- zeichenfolge = NA
- break
- }
- }
- zeichenfolge %>% return() # zuvor erzeugte Beschreibung als Funktionswert zurückgeben
- }
- #' **Lösungen überprüfen --> Aufgabe 8:**
- beschreiben(ausdruck = "A,BCD,E,FG,,H",
- escape = ",",
- standard = "literal")
- #' **Lösungen überprüfen --> Aufgabe 9:**
- beschreiben(ausdruck = "hello, world",
- escape = ",",
- standard = "meta")
- #' **Lösungen überprüfen --> Aufgabe 10:**
- beschreiben(ausdruck = "Haus",
- escape = "a",
- standard = "literal")
- #' **Lösungen überprüfen --> Aufgabe 11:**
- beschreiben(ausdruck = "Haaus",
- escape = "a",
- standard = "literal")
- #' **Lösung überprüfen --> Aufgabe 12:**
- beschreiben(ausdruck = "Haaus",
- escape = "a",
- standard = "meta")
- #' ------------------------
- #' ------------------------
- #' **Für Bearbeitung herangezogene Anleitungen::**
- #'
- #' Debianforum.de - Benutzer Meillo. (2022, 9. April). RegExp-Kurs 02: Metazeichen & Escaping, debianforum.de. Zugriff am 12.04.2022. Verfügbar unter: https://debianforum.de/forum/viewtopic.php?p=1299654#p1299654
- #'
- #' Gruber, W. (2019). _Bedingungen und Schleifen_, Einführung in RStudio. Zugriff am 12.01.2022. Verfügbar unter: https://wgruber.github.io/R-Intro/bedingungen-und-schleifen.html
- #'
- #' Kurkiewicz, D. (2017). _Introduction to docstring_. Zugriff am 12.04.2022. Verfügbar unter: https://cran.r-project.org/web/packages/docstring/vignettes/docstring_intro.html
- #'
- #' Luhmann, M. (2015). _R für Einsteiger. Einführung in die Statistiksoftware für die Sozialwissenschaften; mit Online-Material_ (4., vollständig überarb. und erweiterte Aufl.). Weinheim, Basel: Beltz.
- #'
- #' Riepl, W. (2020, 28. März). _Hilfe erstellen für Funktionen in eigenen R-Paketen (roxygen2)_, Statistik Dresden. Zugriff am 12.04.2022. Verfügbar unter: https://statistik-dresden.de/archives/16054
- #'
- #' Wickham, H. (2022, 23. Januar). _Regular expressions_, stringr.tidyverse.org. Zugriff am 12.04.2022. Verfügbar unter: https://stringr.tidyverse.org/articles/regular-expressions.html
- #'
- #' Xie, Y., Dervieux, C. & Riederer, E. (2022). _3.3 Render an R script to a report | R Markdown Cookbook_. Zugriff am 12.04.2022. Verfügbar unter: https://bookdown.org/yihui/rmarkdown-cookbook/spin.html
Quellcode
Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN