Python string formatting when string contains “%s” without escaping

后端 未结 4 1287

When formatting a string, my string may contain a modulo \"%\" that I do not wish to have converted. I can escape the string and change each \"%\"

相关标签:
4条回答
  • 2020-12-31 03:51

    Escaping a '%' as '%%' is not a workaround. If you use String formatting that is the way to represent a '%' sign. If you don't want that, you can always do something like:

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

    e.g. not using formatting.

    Please note that when using string concatenation, be sure that the variable is a string (and not e.g. None) or use str(varName). Otherwise you get something like 'Can't concatenate str and NoneType'.

    0 讨论(0)
  • 2020-12-31 03:57

    You could (and should) use the new string .format() method (if you have Python 2.6 or higher) instead:

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

    The manual can be found here.

    The docs also say that the old % formatting will eventually be removed from the language, although that will surely take some time. The new formatting methods are way more powerful, so that's a Good Thing.

    0 讨论(0)
  • 2020-12-31 04:08

    You can use regular expressions to replace % by %% where % is not followed by (

    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
    

    This way:

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

    Will output:

    Day old bread, 50% sale today

    This method is useful to avoid "not enough arguments for format string" errors.

    0 讨论(0)
  • 2020-12-31 04:14

    Not really - escaping your % signs is the price you pay for using string formatting. You could use string concatenation instead: 'Day old bread, 50% sale ' + whichday if that helps...

    0 讨论(0)
提交回复
热议问题