2017-06-05 9 views
3

で2つの大文字の間に空白を交換し、私はこのように見える文字列の文字があります。私は何をしたいかアンダースコア

" A E 222;CMPSC 201 orCMPSC 202" 

は作りです、それはこのようになりますように、次のとおりです。

" A_E_222;CMPSC_201 orCMPSC_202" 

これまでのところ、次のコードを試しましたが、アンダースコアを前または後ろに置くだけで、他に何を試すか分かりません。

str_replace_all(x, "([A-Z][:blank:][A-Z])", "\\1_") 

str_replace_all(x, "([A-Z][:blank:][:digit:])", "([A-Z][:digit:])") 
+1

と交換します ' (yada)[:blank:](yada) '\\ 1 _ \\ 2'に置き換えられましたか? – Frank

+0

\\ 2は範囲外だと言いました – Kayla

+1

私は以下のようにakrunの方法が最善であると思いますが(lookaheadとlookbehindを使って)、コードへの直接的な修正は 'gsub("([A-Z0-9]) "[:blank:]]([A-Z0-9])"、 "\\ 1 _ \\ 2"、x) ' – Frank

答えて

2

私たちは、大文字((?<=[A-Z]))に続き、大文字または番号((?=[A-Z0-9]))が続いているスペースに一致するように正規表現前後参照を使用することができ、多分何かのよう_

gsub("(?<=[A-Z]) (?=[A-Z0-9])", "_", v1, perl = TRUE) 
#[1] " A_E_222;CMPSC_201 orCMPSC_202" 
+0

残念ながら、行には他のテキストがあり、すべての下にアンダースコアを付けることはできません。私は特に大文字と大文字と数字の間に下線が必要なだけです。 – Kayla

+1

最後のものは完全に機能しました。本当にありがとう! – Kayla

+1

ええ、私はちょうどしました。私の担当者は非常に低いので、私はそれを受け入れるために5分を待たなければならなかった。 – Kayla

関連する問題