R Language
正規表現(正規表現)
サーチ…
前書き
正規表現(「正規表現」または「正規表現」とも呼ばれる)は、文字列と照合できるパターンを定義します 。 ?regex
Rドキュメントの場合は?regex
と入力し、詳細についてはRegex Docsを参照してください。 SOの正規表現/トピックで学ばれない最も重要な「つかまえ」は、ほとんどのR-regex関数がpattern
パラメータでエスケープするためにペアのバックスラッシュを使用する必要があるということです。
備考
文字クラス
-
"[AB]"
はAまたはB -
"[[:alpha:]]"
は任意の文字 -
"[[:lower:]]"
は小文字を表します。"[az]"
は近いが一致しないことに注意してください(例:ú
。 -
"[[:upper:]]"
は大文字を表します。"[AZ]"
は近いが一致しないことに注意してください(例:Ú
。 -
"[[:digit:]]"
は0,1,2、...、または9の任意の数字を表し、"[0-9]"
と等価です。
数量化
+
、 *
?
いつものように正規表現で適用してください。 - +
は少なくとも1回マッチする、 *
0回以上マッチする、そして?
0回または1回一致します。
ラインインジケータの開始と終了
文字列に正規表現の位置を指定することができます:
-
"^..."
は正規表現を強制的に文字列の先頭に置く -
"...$"
は正規表現を文字列の最後に強制します
他の言語との違い
Rの正規表現は、他の言語で使用されている正規表現とは少し異なる場合があります。
Rは、(ので、二重のバックスラッシュはエスケープが必要です
"\"
すでにR文字列で一般的に逃れることを意味する)、そう、例えば、ほとんどの正規表現エンジン、いずれかの空白をキャプチャすることは、単純に入力する必要があります\s
、対\\s
Rに。RのUTF-8文字は大文字のUでエスケープする必要があります。例:
[\U{1F600}]
と[\U1F600]
一致しますが、Rubyではこれは小文字のuと一致します。
その他のリソース
次のサイトreg101は、Rスクリプトを使用する前にオンライン正規表現をチェックするのに適しています。
R Programming wikibookには、正規表現を使った例がたくさんあるテキスト処理専用のページがあります。
空白を取り除く
string <- ' some text on line one;
and then some text on line two '
空白を削除する
"トリミング"空白は、通常、文字列から先頭と末尾の両方の空白を削除することを指します。これは、前の例の組み合わせを使用して行うことができます。 gsub
は、先頭と末尾のマッチの両方に置換を強制するために使用されます。
R 3.2.0より前
gsub(pattern = "(^ +| +$)",
replacement = "",
x = string)
[1] "some text on line one; \nand then some text on line two"
R 3.2.0以上
trimws(x = string)
[1] "some text on line one; \nand then some text on line two"
先行する空白を削除する
R 3.2.0より前
sub(pattern = "^ +",
replacement = "",
x = string)
[1] "some text on line one; \nand then some text on line two "
R 3.2.0以上
trimws(x = string,
which = "left")
[1] "some text on line one; \nand then some text on line two "
末尾の空白を削除する
R 3.2.0より前
sub(pattern = " +$",
replacement = "",
x = string)
[1] " some text on line one; \nand then some text on line two"
R 3.2.0以上
trimws(x = string,
which = "right")
[1] " some text on line one; \nand then some text on line two"
すべての空白を削除する
gsub(pattern = "\\s",
replacement = "",
x = string)
[1] "sometextonlineone;andthensometextonlinetwo"
タブ( \t
)、改行( \r
と\n
)、空白などの空白文字も削除されることに注意してください。
日付を「YYYYMMDD」形式で検証する
日付を接頭辞として使用するファイルには、 YYYYMMDD
形式で名前を付けることが一般的20170101_results.csv
。例: 20170101_results.csv
。このような文字列形式の日付は、次の正規表現を使用して検証できます。
\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])
上記の式は、年: 0000-9999
、月: 01-12
および日01-31
日付を考慮します。
例えば:
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170101")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20171206")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "29991231")
[1] TRUE
注 :これは日付の構文を検証しますが、有効な構文(たとえば、 20170229
(2017年はうるう年ではありません))で日付を間違えることがあります。
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170229")
[1] TRUE
日付を検証する場合は、このユーザー定義関数を使用して日付を検証できます。
is.Date <- function(x) {return(!is.na(as.Date(as.character(x), format = '%Y%m%d')))}
その後、
> is.Date(c("20170229", "20170101", 20170101))
[1] FALSE TRUE TRUE
アメリカ合衆国の郵便番号の略称を検証する
次のregex
は50州とCommonwealth / Territory( www.50states.com参照)が含まれます:
regex <- "(A[LKSZR])|(C[AOT])|(D[EC])|(F[ML])|(G[AU])|(HI)|(I[DLNA])|(K[SY])|(LA)|(M[EHDAINSOT])|(N[EVHJMYCD])|(MP)|(O[HKR])|(P[WAR])|(RI)|(S[CD])|(T[NX])|(UT)|(V[TIA])|(W[AVIY])"
例えば:
> test <- c("AL", "AZ", "AR", "AJ", "AS", "DC", "FM", "GU","PW", "FL", "AJ", "AP")
> grepl(us.states.pattern, test)
[1] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
>
注意 :
50個の状態だけを確認したい場合は、 state
からstate.abb
というRデータセットを使用することをお勧めします。
> data(state)
> test %in% state.abb
[1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
AL, AZ, AR, FL
50-States略語についてのみTRUE
を得ます。
米国の電話番号を検証する
次の正規表現は次のとおりです。
us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$"
次の形式で電話番号を検証します。 +1-xxx-xxx-xxxx
(各番号グループの先頭と末尾にオプションの先頭/末尾ブランクを含みますが、中央には含まれません): +1-xxx-xxx-xx xx
は無効です。 -
区切り文字は、 xxx xxx xxx
または区切り文字なしのxxxxxxxxxx
空白に置き換えることができます。 +1
プレフィックスはオプションです。
それをチェックしよう:
us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$"
phones.OK <- c("305-123-4567", "305 123 4567", "+1-786-123-4567",
"+1 786 123 4567", "7861234567", "786 - 123 4567", "+ 1 786 - 123 4567")
phones.NOK <- c("124-456-78901", "124-456-789", "124-456-78 90",
"124-45 6-7890", "12 4-456-7890")
有効なケース:
> grepl(us.phones.regex, phones.OK)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
>
無効なケース:
> grepl(us.phones.regex, phones.NOK)
[1] FALSE FALSE FALSE FALSE FALSE
>
注意 :
-
\\s
任意のスペース、タブ、または改行文字と一致します。
R正規表現パターンの文字をエスケープする
Rとregexの両方がエスケープ文字"\"
共有しているので、 grep
、 sub
、 gsub
またはパターン引数を受け入れる他の関数の正しいパターンを構築するには、しばしばバックスラッシュのペアリングが必要です。 1つの項目に改行があり、もう1つが改行で、もう1つが改行でない3つの項目の文字ベクトルを作成する場合は、改行またはタブを4つのスペースに変えて、マッチングのためにバックスラッシュを使用しています:
x <- c( "a\nb", "c\td", "e f")
x # how it's stored
# [1] "a\nb" "c\td" "e f"
cat(x) # how it will be seen with cat
#a
#b c d e f
gsub(patt="\\n|\\t", repl=" ", x)
#[1] "a b" "c d" "e f"
パターンの引数(最初に現れ、省略してスペルのみが必要な場合はオプション)は、この倍精度化またはペアリングを必要とする唯一の引数であることに注意してください。置換引数は、エスケープする必要がある文字の倍数を必要としません。すべての改行と4スペースの出現がタブで置き換えられるようにしたい場合は、次のようになります:
gsub("\\n| ", "\t", x)
#[1] "a\tb" "c\td" "e\tf"
PerlとPOSIX正規表現の違い
Rで実装されている正規表現のエンジンは、わずかに異なる2つあります。デフォルトはPOSIXと一貫しています。 Rのすべての正規表現関数には、後者の型を有効にするオプションも用意されています: perl = TRUE
。
ルックアヘッド/ルックバック
perl = TRUE
は、正規表現のルックアヘッドとルックバックを可能にします。
-
"(?<=A)B"
文字の出現と一致するB
それがが先行しています場合にのみ、A
、すなわち"ABACADABRA"
に一致するだろうが、"abacadabra"
と"aBacadabra"
ではないだろうが。