Comment puis-je utiliser une expression régulière pour remplacer un nombre variable de zéros par le même nombre d'espaces ?

StackOverflow https://stackoverflow.com//questions/9625698

Question

Je travaille avec des données de champ de longueur fixe et je dois réduire les décimales d'une série de nombres à seulement deux décimales.Ce n'est que des zéros après la virgule, il est donc assez facile d'écrire une expression régulière qui se déclenchera dessus.Le problème est que je dois remplacer les zéros supplémentaires par des espaces.Je sais que je peux enregistrer une sous-expression et la rappeler lors du remplacement, mais existe-t-il un moyen de compter le nombre de zéros supprimés et de le rappeler ?J'utilise simplement l'expression régulière dans la fenêtre de remplacement de Notepad++.

Était-ce utile?

La solution

J'ai trouvé quelque chose qui fonctionne ici.

chaîne de recherche : ([.]00[ ]*)0

remplacer la chaîne : \1 (Il y a un espace après le 1)

Cela permet de trouver le .00, suivi d'un nombre quelconque d'espaces, suivi d'un zéro.Il le remplace ensuite par le .00 et les espaces, suivis d'un espace.Chaque fois qu'il est exécuté, il remplace un autre zéro supplémentaire par un espace.Cela fonctionne, mais quelqu'un peut-il penser à quelque chose qui ne doit être exécuté qu'une seule fois ?Cela a fonctionné dans ce cas, mais j'ai eu d'autres moments où j'aurais souhaité que les regex puissent compter.

Autres conseils

Cela a travaillé dans ce cas, mais j'ai eu d'autres moments où je souhaitais que le regex puisse compter.

n'avons-nous pas tous souhaité qu'à une fois ou à une autre :)

La seule façon de faire ce dont vous avez trouvé est d'utiliser la bibliothèque d'expression régulière de Python, ce qui vous permet de spécifier une fonction de remplacement, au lieu d'une chaîne de remplacement.Donc, vous pouvez faire cet appel sur chaque ligne de votre fichier:

re.sub(search_string, replace_func, line)

Voici comment vous l'utiliseriez:

import re
search_string = r'(\.0{2})(0+)'
# this function is called for each match, and returns the replace string
def replace_func(match):
    num_zeroes = len(match.group(2))
    if num_zeroes:
        return match.group(1) + num_zeroes * ' '
    else:
       return ''

for line in ('1234.0', '1234.00', '1234.000', '1234.0000'):
    print re.sub(search_string, zero_replacer, line)

Malheureusement, cela ne vous aide pas pour NotePad ++, mais si vous êtes intéressé, je pourrais rédiger un script Python plus complet qui lirait votre dossier et faire le travail.

Vous devez exécuter cela dans une boucle pour utiliser correctement les références du dos:

var data = "7.00000000000 5.00000000 8.0 9.000000000000000000000";
var re = /(\.0{0,2})(0*)/;
alert(data.replace(re, RegExp.$1 +RegExp.$2.replace(/0/, 'x')));

éditer: première réponse effondrée, ce qui n'est pas ce que l'op voulait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top