Extract the middle N chars of a string

Steven D'Aprano steve at pearwood.info
Wed May 18 11:47:33 EDT 2016


Extracting the first N or last N characters of a string is easy with
slicing:

s[:N]  # first N
s[-N:]  # last N

Getting the middle N seems like it ought to be easy:

s[N//2:-N//2]

but that is wrong. It's not even the right length!

py> s = 'aardvark'
py> s[5//2:-5//2]
'rdv'


So after spending a ridiculous amount of time on what seemed like it ought
to be a trivial function, and an embarrassingly large number of off-by-one
and off-by-I-don't-even errors, I eventually came up with this:

def mid(string, n):
    """Return middle n chars of string."""
    L = len(string)
    if n <= 0:
        return ''
    elif n < L:
        Lr = L % 2
        a, ar = divmod(L-n, 2)
        b, br = divmod(L+n, 2)
        a += Lr*ar
        b += Lr*br
        string = string[a:b]
    return string


which works for me:


# string with odd number of characters
py> for i in range(1, 8):
...     print mid('abcdefg', i)
...
d
de
cde
cdef
bcdef
bcdefg
abcdefg
# string with even number of characters
py> for i in range(1, 7):
...     print mid('abcdef', i)
...
c
cd
bcd
bcde
abcde
abcdef



Is this the simplest way to get the middle N characters?



-- 
Steven




More information about the Python-list mailing list