2017-08-11 1 views
1

私は現在、Rでテキストデータを整理するためにregexを使用する方法を見つけようとしています。私は少しオンラインで見てきましたが、regex101で何か試してみると、ほとんどマッチを見つけることができません。そして、私がそうするなら、Rの中で何も変わりません。この例を考えてみましょう特定のパターンのRegex検索が見つかった場合は、何かに置き換えてください

Before <- "ACEMOGLU, D., ROBINSON, J., (2012) WHY NATIONS FAIL, (3)" 
After <- "ACEMOGLU, D., ROBINSON, J., 2012, WHY NATIONS FAIL, (3)" 


> Aftergsub <- gsub("\\([\\d][\\d][\\d][\\d]\\)", "new", "ACEMOGLU, D., ROBINSON, J., (2012) WHY NATIONS FAIL, (3)") 
> print(Aftergsub) 
[1] "ACEMOGLU, D., ROBINSON, J., (2012) WHY NATIONS FAIL, (3)" 
> 

もちろん、「新しい」は「Before」のようになる式にする必要があります。しかし、私は前に私のパターンに基づいて、他のものに変更することはできません。

つまり、 ")"を "、"に変更するには、先に4桁の数字を使用しますか? ありがとう!

答えて

0

TRE正規表現のフレーバでは、ブラケット式内の短い文字クラスはサポートされていないため、パターンが機能しません。 [[:digit:]]または[0-9]を使用する必要がありますが、[\\d](実際はmatches a \ or a letter d)を使用しないでください。

あなたは

Before <- "ACEMOGLU, D., ROBINSON, J., (2012) WHY NATIONS FAIL, (3)" 
gsub("\\((\\d{4})\\)", "\\1,", Before) 
## => [1] "ACEMOGLU, D., ROBINSON, J., 2012, WHY NATIONS FAIL, (3)" 

を使用することができますが、その周りに私が角括弧(=ブラケット表現)なし\\dを使用していますR online demo

NOTEを参照してください。 TRE正規表現エンジンは"\\d{4}"を4桁の一致パターンとして扱います。それは[0-9]{4}または[[:digit:]]{4}に等しいです。

詳細

  • \\( - リテラル(
  • (\\d{4}) - グループ1:任意の4桁の数字
  • \\) - リテラル)
  • \\1 - グループ1への後方参照値
+0

'gsub'、 ' gsub( "\\((\\ d {4})\\)"、 "\\ 1"、前に) ' – Sagar

+0

で値の代わりに変数を渡すこともできます。それはOPが最終的にやることです。私はここにコードを含めます。 –

+0

私はこのようなgsubを多くの異なるエントリで実行する必要があります。もしSagarが値の変数を渡すことができるとすれば、それは他のエントリでも動作しますか?そうであれば、どのように見えるでしょうか?つまり、「\\((\\ d {4})\\)」、「\\ 1」、「my.dataframe」)ですか? – SCW

関連する問題