str_detect()の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!! 文字列の有無を検索する

'''str_detect(string, pattern)'''は
変数stringに該当するpattern文字列が入っているかどうかを調べる関数。TRUE/FALSEが返される。

通常、patternの部分は一単語だが、複数入れたり条件式にしたい場合がある。

! 単純な例:patternに検索したい言葉をあてる
 > str_detect("今日はよいお天気です", "晴れ")
 [1] FALSE
 > str_detect("今日はよいお天気です", "天気")
 [1] TRUE

! 複数の言葉で条件を入れたい時::AND条件 OR条件を使い分ける
 > str_detect("明日は晴れか曇りかわかりません", "晴れ, 雨")    #AND条件はカンマで区切る=NG
 [1] FALSE
 > str_detect("明日は晴れか曇りかわかりません", "晴れ, 曇り")  #AND条件はカンマで区切る=NG
 [1] FALSE
 > str_detect("明日は晴れか曇りかわかりません", "(?=.*晴れ)(?=.*曇り)") #AND条件はやや難しい 
 [1] TRUE
 > str_detect("明日は晴れか曇りかわかりません", "晴れ|曇り") #OR条件はパイプでつなぐ
 [1] TRUE
 > str_detect("明日は晴れか曇りかわかりません", c("晴れ","曇り"))  #どちらの条件が該当するかがわかる
 [1] TRUE TRUE
! 始まりの文字列で指定したいときは、str_starts()を使う

 > pat = "(REV|Rev|ACC|acc)"
 > str_starts(c(" REV", "rev", "Rev/", "REV/ACC"), pattern = regex(pat, ignore_case = T))
 [1] FALSE  TRUE  TRUE  TRUE
 > str_starts(str_trim(c(" REV", "rev", "Rev/", "REV/ACC")), pattern = regex(pat, ignore_case = T)) #開始の空白を取り除く
 [1] TRUE TRUE TRUE TRUE
 > pat = "rev|acc"
 > str_starts(str_trim(c(" REV", "rev", "Rev/", "REV/ACC")), pattern = regex(pat, ignore_case = T))
 [1] TRUE TRUE TRUE TRUE

!検索パターンをはじめから正規表現で定義しておくこともできる
 > pat = regex(pat, ignore_case=T) #検索パターンをはじめから正規表現で定義しておくこともできる
 > pat
 [1] "rev|acc"
 attr(,"options")
 attr(,"options")$case_insensitive
 [1] TRUE
 attr(,"options")$comments
 [1] FALSE
 attr(,"options")$dotall
 [1] FALSE
 attr(,"options")$multiline
 [1] FALSE
 attr(,"class")
 [1] "stringr_regex"   "stringr_pattern" "character"      

 > str_starts(str_trim(c(" REV", "rev", "Rev/", "REV/ACC")), pattern = pat)
 [1] TRUE TRUE TRUE TRUE
 
! さらに複雑なパターン::正規表現を使う
 > string = c("金が増えた", "金が減った", "腹が減った", "金メダルが増えた", "金メダイが食いたい")
 > str_detect(string, pattern = "金.*(増|減)")
 [1]  TRUE  TRUE FALSE  TRUE FALSE
 > str_detect(string, pattern = "金メ.*(増|減)")
 [1] FALSE FALSE FALSE  TRUE FALSE
 > str_detect(string, pattern = "金が.*(増|減)")
 [1]  TRUE  TRUE FALSE FALSE FALSE

:以下は松澤教授による:

 > string = c("金が増えた", "カネを増やす", "金が減った", "腹が減った", "金メダルが増えた", "金メダイが食いたい")
 > w1 = c("金", "カネ")
 > w2 = c("増", "減")

 > pattern1 = paste0("(", paste0(w1, collapse = '|'), ".*", paste0(w2, collapse = '|'),")") 
 > str_detect(string, pattern1)
 [1] TRUE TRUE TRUE TRUE TRUE TRUE

 > w1 = c("が", "金")
 > pattern1 = paste0("(", paste0(w1, collapse = '|'),")", ".*", "(", paste0(w2, collapse = '|'),")") 
 > pattern1
 [1] "(が|金).*(増|減)"
 > str_detect(string, pattern1)
 [1]  TRUE FALSE  TRUE  TRUE  TRUE FALSE

 「.*」は任意の文字数列を表現する

:ベテランからのアドバイス:

凝った正規表現はロジックの可読性が悪いので、複数に分けてcodingしたほうがよい。