pythonjoinsplitpunctuation

Join split words and punctuation with punctuation in the right place


So I tried using join() after splitting a string into words and punctuation but it joins the string with a space in between the word and punctuation.

b = ['Hello', ',', 'who', 'are', 'you', '?']
c = " ".join(b)

But that returns:
c = 'Hello , who are you ?'

and I want:
c = 'Hello, who are you?'


Solution

  • You could join on the punctuation first:

    def join_punctuation(seq, characters='.,;?!'):
        characters = set(characters)
        seq = iter(seq)
        current = next(seq)
    
        for nxt in seq:
            if nxt in characters:
                current += nxt
            else:
                yield current
                current = nxt
    
        yield current
    
    c = ' '.join(join_punctuation(b))
    

    The join_punctuation generator yields strings with any following punctuation already joined on:

    >>> b = ['Hello', ',', 'who', 'are', 'you', '?']
    >>> list(join_punctuation(b))
    ['Hello,', 'who', 'are', 'you?']
    >>> ' '.join(join_punctuation(b))
    'Hello, who are you?'