2017-09-18 3 views
1

J'espère que ceci est suffisamment différent, les messages antérieurs pour justifier son propre thread; Malheureusement, ils ne m'ont pas aidé. Je pense que mon intérêt pour le remplacement partiel, plus l'utilisation d'un caractère générique est donc unique, mais excuses si je n'ai simplement pas cherché ou lu assez attentivement!R gsub remplacement des caractères génériques

Supposons que j'ai la chaîne suivante:

str <- c("FOO_1", "FOO_2", "BAR_1", "BAR_2") 

Je voudrais remplacer le 1 à la fin de FOO_1 avec autre chose, dire A. J'ai essayé de le faire avec les deux

gsub("[^F.*](1)$", "\\_A", str) 

et

gsub("^F.*(1)$", "\\_BLAH", str) 

mais clairement ni d'entre eux travaillaient pour remplacer seulement1, laissant le reste de FOO_ intact, tout en ne modifiant pas BAR_1. J'ai une solution bête au problème qui implique simplement une ligne de grep() et une ligne de gsub(), mais je me déteste si c'est ce que je m'installe.

+1

Quelle est la règle ici? Il suffit de remplacer '_1' à la fin de la chaîne? 'sub (" _ 1 $ "," _A ", x)'? Voir [cette démo] (https://ideone.com/mKj7Uh) - c'est ce que vous cherchez? –

+0

Malheureusement, non; Je ne veux remplacer que les variables _starting_ avec FOO et _ending_ avec '1'. Ainsi, par exemple, si l'approche change 'BAR_1' en' BAR_A', c'est un échec. J'essayais juste de fournir un exemple de travail minimal, mais dans le cas actuel, il y a plusieurs permutations de la même variable. Par exemple., 'FOO_A_1',' FOO_B_1', et ainsi de suite; Je voudrais capturer tout '^ FOO. * 1 $' (désolé si cela est indiqué incorrectement). – ironchefsakai

+1

['sub ("^(FOO. *) _ 1 $ "," \\ 1_A ", str)'] (https://ideone.com/Nxqsi9)? –

Répondre

1

Je veux seulement remplacer les variables à partir avec FOO et se termine avec 1

capture FOO et tout ce qui suit dans le groupe 1 et juste correspondre _1 à la fin de la chaîne. Ensuite, dans le modèle de remplacement, utilisez un backreference de remplacement à la valeur Groupe1:

str <- c("FOO_1", "FOO_2", "BAR_1", "BAR_2") 
sub("^(FOO.*)_1$", "\\1_A", str) 
## => [1] "FOO_A" "FOO_2" "BAR_1" "BAR_2" 

Voir this R demo

Si une quantité de chiffres à la fin de la chaîne doit être adaptée, remplacer 1 avec \\d+.

Détails

  • ^ - chaîne commencer
  • (FOO.*) - FOO puis sous-chaîne des caractères 0+, autant que possible
  • _1 - une sous-chaîne _1 (si vous remplacez 1 avec \\d+ , il correspondra à 1 ou plusieurs chiffres)
  • $ - fin de la chaîne.