Brian wrote:


On Sat, Aug 15, 2009 at 4:06 PM, MRAB <pyt...@mrabarnett.plus.com <mailto:pyt...@mrabarnett.plus.com>> wrote:

    ryles wrote:

        On Aug 14, 8:22 pm, candide <cand...@free.invalid> wrote:

            Suppose you need to split a string into substrings of a
            given size (except
            possibly the last substring). I make the hypothesis the
            first slice is at the
            end of the string.
            A typical example is provided by formatting a decimal string
            with thousands
            separator.

            What is the pythonic way to do this ?

            For my part, i reach to this rather complicated code:

            # ----------------------

            def comaSep(z,k=3, sep=','):
               z=z[::-1]
               x=[z[k*i:k*(i+1)][::-1] for i in range(1+(len(z)-1)/k)][::-1]
               return sep.join(x)

            # Test
            for z in ["75096042068045", "509", "12024", "7", "2009"]:
               print z+" --> ", comaSep(z)

            # ----------------------

            outputting :

            75096042068045 -->  75,096,042,068,045
            509 -->  509
            12024 -->  12,024
            7 -->  7
            2009 -->  2,009

            Thanks


        py> s='1234567'
        py> ','.join(_[::-1] for _ in re.findall('.{1,3}',s[::-1])[::-1])
        '1,234,567'
        py> # j/k ;)


    If you're going to use re, then:


     >>> for z in ["75096042068045", "509", "12024", "7", "2009"]:
           print re.sub(r"(?<=.)(?=(?:...)+$)", ",", z)


75,096,042,068,045
    509
    12,024
    7
    2,009


Can you please break down this regex?

The call replaces a zero-width match with a comma, ie inserts a comma,
if certain conditions are met:

"(?<=.)"
    Look behind for 1 character. There must be at least one previous
character. This ensures that a comma is never inserted at the start of
the string. I could also have used "(?<!^)". Actually, it doesn't check
whether the first character is a "-". That's left as an exercise for the
reader. :-)

"(?=(?:...)+$)"
    Look ahead for a multiple of 3 characters, followed by the end of
the string.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to