2017-01-06 27 views
1

郵便番号の中央に「+」記号を挿入しようとしています。 AA111AAまたはAA11AAのパターンに従うポストコード。最後の数字の前に "+"を挿入して、AA11+1AAまたはAA1+1AAのいずれかの出力を挿入します。私はstringrを使用してこれを行う方法を見つけましたが、これを行う簡単な方法があるように感じています。以下は私のコードです。文字を文字列に動的に挿入するR

pc <- "bt43xx" 

pc <- str_c(
     str_sub(pc, start = 1L, end = -4L), 
     "+", 
     str_sub(pc, start = -3L, end = -1L) 
    ) 

pc 
[1] "bt4+3xx" 

答えて

3

ここにいくつかの選択肢があります。 pcがスカラまたはベクトルの場合、すべてのソリューションが動作します。パッケージは必要ありません。それらのうち(3)は特に短く単純です。

1)マッチすべて(.*)最後の桁(\\d)まで、次に括弧の最初のセット内の部分に一致する、すなわち最初のキャプチャ(とそれを置き換える)、プラスと第二の捕捉(すなわち、最後の数字との一致)。

sub("(.*)(\\d)", "\\1+\\2", pc) 

2)も短い代替の非数字が続く数字と一致し、一致続いプラスとそれを置き換えることである:

sub("(\\d\\D)", "+\\1", pc) 
## [1] "bt4+3xx" 

3)これは(2)よりも短くなります。これはマッチが続くプラスとの一致を置換最後の3つの文字にマッチ:

sub("(...)$", "+\\1", pc) 
## [1] "bt4+3xx" 

4)この1つは、個々の文字に文字列を分割appendを用いて適切な位置にプラスを挿入し、文字を置きます一緒に戻る

sapply(Map(append, strsplit(pc, ""), after = nchar(pc) - 3, "+"), paste, collapse = "") 
## [1] "bt4+3xx" 

pcは、それが簡単にすることができ(該当の場合のように)スカラーであることが知られていた場合:+が後にあるように、これはOPのニーズに合わせていないようです

paste(append(strsplit(pc, "")[[1]], "+", nchar(pc) - 3), collapse = "") 
[1] "bt4+3xx" 
1

この正規表現subと2つの後方参照が有効です。

sub("(\\d?)(\\d[^\\d]*)$", "\\1+\\2", pc) 
[1] "bt4+3xx" 
  • \\ D? 1または0の数字、0-9に一致し、()によって取り込まれます。少なくとも2つの数字がある場合は一致します。
  • \\ D [^ \\ D] *すべての非数値文字に続く数字と一致し、かつ(によって捕獲された)
  • $は文字列
  • 「の最後に正規表現をアンカー\\ 1 + \ 2 "は最初の2つの点の一致した要素を自分自身に、" + "を中央に置き換えます。
+1

数字。 'サブ("(*)(\\ d \\ D {2}) "、" \\ 1 + \\ 2 "、pc)' – Haboryme

+0

Ugh。私は逃しました。キャッチーありがとうございます。 – lmo

1
sub('(\\d)(?=\\D+$)','+\\1',pc,perl=T) 
関連する問題