-2
votes

Ajout de zéro directeur avec une expression régulière

dise que j'ai une corde comme xxx

J'espère sortir pour être xxx

si le début est le numéro, ajoute 0 Pour en faire trois chiffres.

est là un moyen d'atteindre l'utilisation de regex dans Python?


0 commentaires

3 Réponses :


4
votes

Oui, les regexes peuvent faire cela. Utilisez RE2 () avec une fonction de rappel: xxx

Le modèle que j'ai utilisé, ^ (\ d +) correspond à 1 ou plusieurs chiffres ( \ d est Un chiffre, + correspondra au moins une fois mais englobera tous les chiffres suivants), mais uniquement au début de la chaîne ( ^ est le "début du texte". Ici).

Puis, pour chaque motif correspondant, la fonction pad_number () est appelée et la chaîne que cette fonction renvoie est utilisée pour remplacer le motif correspondant. Parce que le motif utilise un groupe de capture (tout entre ( et ) est un tel groupe) la fonction peut accéder aux chiffres correspondants en appelant match.group (1) .

La fonction transforme les chiffres en un entier, puis utilise le format () fonction pour revenir entier dans le texte, mais cette fois-ci en tant que numéro de 3 caractères matelassés à 0; C'est ce que l'instruction 03 indique le format () à produire.

Notez que le motif peut correspondre plus chiffres, Mais les limiter n'a pas beaucoup de sens, sauf s'il existe un nombre supérieur strict que vous souhaitez limiter à (à quel point vous devez également ajouter une restriction sur le caractère suivant pas étant un chiffre). Le format (numéro, "03d") L'instruction produit un numéro au moins 3 chiffres de large mais peut gérer des valeurs plus longues.

Démo: > xxx

Encore une fois, prenez en compte la présente méthode des cessions spéciales avec 4 chiffres ou plus au début; Vous obtenez simplement une séquence de chiffres plus longue: xxx

Cela se produirait même si nous limitations le modèle \ d pour ne correspond à 3 chiffres maximum ( Par exemple, avec \ d {1,3} ).

Si vous souhaitez effectuer la largeur de rembourrage configurable, vous pouvez tout mettre dans une fonction imbriquée et utiliser la mise en forme de chaîne. Vous ne devez pas vraiment besoin xxx

démo: xxx


7 commentaires

J'aimerais entendre ce qui n'est pas utile ou tort de ma réponse, de mériter un bowvote. De cette façon, je peux améliorer ma réponse!


Quelqu'un DV tous les deux - peut-être une "aucune tentative sur la question, permet de descendre toutes les réponses" DV ...


@Martijnpieters merci beaucoup! Une question latérale: est-il possible de mettre le paramètre 3 en tant que paramètre de fonction ou variable pour être entré par l'utilisateur?


@ William007: Oui, avec la formatage de chaîne Vous pouvez générer des modèles d'expression réguliers et vous souhaiteriez utiliser une fermeture pour que la fonction de remplacement, récupérez le paramètre à utiliser dans Format () Fonction.


@ WilliAiam007: Mettez donc tout dans une fonction (y compris le pad_number () fonction, non altéré autre que l'indentation), avec largeur comme paramètre et modifiez le format () appelez au format (numéro, f "0 {largeur} d") .


@ WilliAiam007: J'ai réalisé qu'il n'y a pas de point de définition d'une limite supérieure à la correspondance du chiffre, j'ai donc changé cela pour simplement utiliser + .


@Martijnpieters a noté, de grands changements



0
votes

Vous avez spécifiquement demandé à RegEx - (voir Solution de Martijn ) - mais peut le faire avec une manipulation de chaîne aussi: xxx pré>

sortie: p> xxx pré>


alternatif - supposé être plus rapide: p>

def prefixZeroIfStartWithNumber(t):
    number, _, remainder = t.partition(" ")
    try:
        k = int(number)
        return f"{k:03} {remainder}" # format with zeros, add remainder
    except (ValueError, IndexError): 
        return t 


3 commentaires

Quelqu'un sur une Sauvage DV Spree - Gotta l'aime.


Eh bien, cela donne au moins une certaine crédence qu'elles peuvent provenir de quelqu'un qui estime que nous n'avions pas de confiance pour avoir répondu à cette question, et non parce que nous avons manqué quelque chose dans nos réponses.


CONSEIL PRO: Lorsque vous divisez juste une fois sur une chaîne fixe, utilisez str.partition () ; Il est plus rapide pour cette usecase. Par exemple. premier, _, reste = t.partition ("") .



0
votes

@martijn Pieters vous a donné la réponse correcte em>, mais vous pouvez également faire la même chose plus simple, exécutez cette regex deux fois: xxx pré>

ici je vous montre la même chose en JavaScript pour la simplicité: p>

p>

const regex = /^(?=\d\d? )/gm;
const str = `
1 - hello.mp3
22 - hellox.mp3
223 - hellox.mp3
hellox.mp3`;

const subst = `0`;

const result = str.replace(regex, subst).replace(regex, subst);

console.log('Substitution result: ', result);


0 commentaires