2010-05-17 5 views
17

Lors de la mise en forme d'une chaîne, ma chaîne peut contenir un modulo "%" que je ne souhaite pas convertir. Je peux échapper la chaîne et changer chaque "%" en "%%" comme une solution de contournement.Formatage de chaînes Python lorsque la chaîne contient "% s" sans s'échapper

par exemple,

'Day old bread, 50%% sale %s' % 'today!' 

sortie:

'Day old bread, 50% sale today' 

Mais y at-il des alternatives à échapper? J'espérais que l'utilisation d'un dict permettrait à Python d'ignorer toutes les conversions sans mot-clé.
par exemple,

'Day old bread, 50% sale %(when)s' % {'when': 'today'} 

mais Python voit toujours le premier modulo % et donne:

TypeError: not enough arguments for format string 
+2

échapper% n'est pas une solution de contournement, c'est une façon documentée et officielle de le faire. – SilentGhost

Répondre

22

Vous pouvez (et devez) utiliser le new string .format() method (si vous avez Python 2.6 ou supérieur) à la place:

"Day old bread, 50% sale {0}".format("today") 

The manual can be found here.

Les docs disent aussi que le vieux formatage % sera finalement supprimé de la langue, bien que cela prendra sûrement un certain temps. Les nouvelles méthodes de formatage sont beaucoup plus puissantes, c'est donc une bonne chose.

+0

Si vous ne voulez pas imprimer le format "{{0}} = {0}". ("Aujourd'hui"), vous n'aimerez pas doubler les accolades. : ^) –

+0

@MarkTolonen Ugg, je suis venu ici en particulier dans l'espoir de trouver une solution au problème de format "{{0}}" (...) ... – KSletmoe

2

Pas vraiment - échapper à vos signes% est le prix que vous payez pour utiliser la mise en forme de chaîne. Vous pouvez utiliser la concaténation de chaînes à la place: 'Day old bread, 50% sale ' + whichday si cela vous aide ...

+0

Pour où je dois supporter Python 2.5 ou antérieur, c'est la méthode que je vais utiliser. –

2

L'échappement d'un '%' en '%%' n'est pas une solution de contournement. Si vous utilisez la mise en forme de chaîne qui représente le signe '%'. Si vous ne le souhaitez pas, vous pouvez toujours faire quelque chose comme:

print "Day old bread, 50% sale " + "today" 

par exemple. n'utilisant pas le formatage.

Veuillez noter que lors de l'utilisation de la concaténation de chaîne, assurez-vous que la variable est une chaîne (et non par exemple Aucune) ou utilisez str(varName). Sinon, vous obtenez quelque chose comme 'Impossible de concaténer str et NoneType'.

2

Vous pouvez utiliser des expressions régulières pour remplacer% par %% où% n'est pas suivie (

def format_with_dict(str, dictionary): 
    str = re.sub(r"%([^\(])", r"%%\1", str) 
    str = re.sub(r"%$", r"%%", str) # There was a % at the end? 
    return str % dictionary 

De cette façon:

print format_with_dict('Day old bread, 50% sale %(when)s', {'when': 'today'}) 

Affichera:

JOUR pain, 50% vente aujourd'hui

Cette méthode est utile pour éviter les erreurs "pas assez d'arguments pour la chaîne de format".

Questions connexes