J'ai une chaîne

text = "Math\n      \n      \n        600 rubles / 45 min."
text2 = "Math\n      \n      \n        in a group"

Et je veux remplacer \n \n \n par " " uniquement si les chiffres suivent. En conséquence, je souhaite avoir:

"Math 600 rubles / 45 min."
"Math\n      \n      \n        in a group"

J'ai essayé gsub("\n \n \n [\\d]", " ", text), mais il remplace également le premier chiffre.

4
nurma_a 27 nov. 2017 à 16:26

3 réponses

Meilleure réponse

Vous pouvez utiliser un modèle qui correspondra à 3 occurrences de \n suivies de plus de 6 espaces, puis capturer le chiffre et le remplacer par une référence arrière au groupe 1:

gsub("(?:\n {6,}){3}(\\d)", " \\1", text)

Voir la démo R

Détails

  • (?:\n {6,}){3} - 3 occurrences consécutives de:
    • \n - une nouvelle ligne
    • {6,} - 6 espaces ou plus
  • (\\d) - Groupe 1 (désigné par \1 du modèle de remplacement): n'importe quel chiffre.
3
Wiktor Stribiżew 27 nov. 2017 à 13:29
text =c("Math\n      \n      \n        600 rubles / 45 min.","Math\n      \n      \n        in a group")
gsub('((\n\\s+){1,})(?=\\d)',' ',text,perl=T)
#[1] "Math 600 rubles / 45 min."                "Math\n      \n      \n        in a group"
2
Shenglin Chen 27 nov. 2017 à 13:50

J'ai trouvé le modèle suivant:

gsub("\\n[[:blank:]]*\\n[[:blank:]]*\\n[[:blank:]]*(\\d+)", " \\1", text)

Ce modèle correspond à trois nouvelles lignes, successivement, se terminant par un nombre. Il permet une quantité arbitraire et non fixe d'espaces blancs entre chaque nouvelle ligne. Cela rend la correspondance flexible et permet d'éviter un raté de comptage incorrect des espaces (ou de nouvelles données entrantes ne se comportant pas comme prévu).

Le principal problème que je vois avec votre appel actuel à gsub est que vous utilisez des espaces de largeur fixe entre les sauts de ligne. De plus, [\\d] n'est jamais utilisé dans le remplacement. Par conséquent, vous consommez ce numéro mais il n'apparaîtra pas le remplacement.

Démo

3
Tim Biegeleisen 27 nov. 2017 à 13:43
47512066