11章 stringrによる文字列

11.0 ライブラリの読み込み

library("tidyverse")
library("stringi")

11.1 はじめに

練習問題はありません

11.2 文字列の基本

練習問題1 paste()paste0()の機能の違いは何ですか?

paste()は、デフォルトで文字列をスペースで区切りますが、paste0()はスペースで区切りません。

paste("hoge", "fuga", "piyo")
[1] "hoge fuga piyo"

paste0("hoge", "fuga", "piyo")
[1] "hogefugapiyo"

str_c()paste0()は似ています。

str_c("hoge", "fuga", "piyo")
[1] "hogefugapiyo"

練習問題2 str_c()sepcollapseの違いを説明してください

sepは、文字の間に挿入される文字列であり、collapseは文字ベクトルを分離する際に使用されるの任意の文字列です。

練習問題3 str_length()str_sub()を使用して文字列から中間文字を抽出します。文字列の文字数が偶数の場合どうしますか。

ここでは偶数の場合、中間文字の先頭をとります。

練習問題4 str_wrap()はいつ使用しますか。

str_wrap()は、テキストが一定の幅に収まるように折り返します。これは、長い文字列を折り返して植字する場合に便利です。

練習問題5 str_trim()は何か。逆の操作は何か。

str_trim()は文字列から空白を削除します。

逆の操作はstr_pad()です。

練習問題6 c("a", "b", "c")を文字列a, b and cに変換する関数を作成します。

11.3 正規表現でパターンマッチ

str_view()はRStudioのViewerの部分でマッチしている箇所を確認できます。Viewerに表示される出力を参考までに記載しています。

練習問題1 "\"が"\"、"\\"、"\\\"とマッチしないのはなぜか。

  • "\":Rは次の文字をエスケープします。

  • "\\":正規表現の\に解決され、正規表現の次の文字をエスケープします。

  • "\\\"注:最初の2つのバックスラッシュは正規表現のリテラルバックスラッシュに解決され、3番目のバックスラッシュは次の文字をエスケープします。正規表現では、これはエスケープ文字をエスケープします。

練習問題2 文字列「""\」とはどうマッチするのか。

練習問題3 正規表現"......"は、どのようなパターンとマッチするのか。

練習問題3 文字列"$^$"はどのようにマッチしますか

練習問題4 一般的な単語のコーパスを考慮して、以下のstringr::wordsすべての単語を検索する正規表現を作成します。

  • 「y」で始まる。

  • 「x」で終わる。

  • ちょうど3文字の長さ。

  • 7文字以上。

練習問題5 次のワードを探す正規表現を作りなさい。

  • 母音で始まる。

  • 子音だけが含まれる。

  • edで終わるが、eedではない。

  • ingまたはizeで終わる。

練習問題6 「cのあとを除いてeの前にi」という規則を検証しなさい。

練習問題7 「qのあとにはuが続く」という規則を検証しなさい。

練習問題8 イギリス英語にマッチする正規表現を作りなさい。

英語自体そこまで得意ではないの詳しく調べてませんが、一般的な場合では、これは困難だそうです。それ用の辞書を必要とする可能性があります。

練習問題9 自分の国の電話番号の正規表現を作りなさい。

練習問題10 "?"、"+"、"*"と等価な{m,n}を作りなさい。

正規表現に明るくないので、質問の意味がイマイチわかりませんでした。r4ds-exercise-solutioの回答をそのまま記載しておきます。

練習問題11 これらの正規表現が一致するものを言葉で説明してください。

  • ^.*$

任意の文字列に一致します。

  • "\{.+\}"

少なくとも1文字を囲む中括弧を含む任意の文字列に一致します。

  • \d{4}-\d{2}-\d{2}

4桁の数字の後にハイフン、2桁の数字、ハイフン、さらに2桁の数字が一致します。

  • "\\{4}"

4つのバックスラッシュと一致するとおもわれます。

練習問題12 以下のすべての単語を見つけるための正規表現を作成しなさい。

  • 3つの子音から始める。

  • 連続して3つ以上の母音を持つ。

  • 連続して2つ以上の母音 - 子音ペアを持つ。

練習問題13 https://regexcrossword.com/challenges/で初心者用の正規表現クロスワードを解く

自分で遊んでみてください!

練習問題14 これらの表現が一致するものを言葉で説明してください。

  • (.)\1\1

同じ文字が3回続けて表示されます。

  • "(.)(.)\2\1"

文字のペアの後に同じ文字のペアが逆の順序で続きます。

  • (..)\1

任意の2文字が繰り返されます。

  • "(.).\1.\1"

任意の文字、元の文字、他の文字、元の文字が続く文字。

  • "(.)(.)(.).*\3\2\1"

3文字の後に任意の種類の0個以上の文字が続き、その後に同じ3文字が続きますが、逆の順序です。

練習問題15 以下の単語に一致するように正規表現を作成します。

  • 同じ文字で始まり、同じ文字で終わる。

  • 繰り返された文字のペアを含む。

  • 少なくとも3つの場所で繰り返される1つの文字を含む。

11.4 ツール

練習問題1 単一の正規表現と複数のstr_detect()の組み合わせの両方を使用してそれを解決しなさい。

  • xで始まるまたは終わる単語をすべて探す。

  • 母音で始まり子音で終わる単語をすべて見つける。

  • それぞれ異なる母音を少なくとも1つ含む単語はあるか。

練習問題2 母音の数が多いのはなんの単語ですか?母音の割合が最も高いのはどの単語ですか。

練習問題3 前の例では、正規表現が「flickered」と一致していることに気付いたかもしれないが、これは色ではない。正規表現を修正しなさい。

練習問題4 ハーバードのセンテンスデータから、次を抽出しなさい。

  • 各文の最初の単語

  • すべての単語がで終わりますing。

  • すべて複数形

練習問題5 「one」、「two」、「three」などの「number」の後に続くすべての単語を見つけなさい。

練習問題6 アポストロフィを使った短縮形をさがしなさい。

練習問題7 文字列内のすべてのスラッシュをバックスラッシュに置き換えます。

練習問題8 replace_all()を使用し、str_to_lower()のシンプル版を作成しなさい。

練習問題9 wordsの最初と最後の文字を入れ替えなさい

練習問題10 文字列"apples, pears, and bananas"を個々のコンポーネントに分割します。

練習問題11 " "よりもboundary("word")で分割するほうがいいのはなぜか。

スペースで文字列を分割すると、句読点と単語がグループ化されます。

練習問題12 ("")空の文字列で分割するとどうなりますか?

文字列を個々の文字に分割します。

11.5 他の種類のパターン

練習問題1 "\"を探すために、regex()とfixed()とでそれぞれどうすればいいか。

練習問題2 sentencesで利用されている5つの最も一般的な言葉は何ですか?

str_extract_all()を引数とともに使用すると、boundary("word")ですべての単語が抽出されます。

11.6 正規表現の別の用途

練習問題はありません

11.7 stringi

練習問題1 以下をstringi関数で探しなさい。

  • 単語数を数えます。

  • 重複した文字列を見つけます。

  • ランダムなテキストを生成します。

練習問題2 stri_sort()が整列に使う言語をどのように制御しますか?

stri_sort(..., opts_collator=stri_opts_collator(locale = ...))またはstri_sort(..., locale = ...)のいずれかでソートするときに使用するロケールを設定できます。

stri_opts_collator()により、文字列のソート方法を細かく制御できます。

最終更新

役に立ちましたか?