Соедините разделенные слова и знаки препинания со знаками препинания в нужном месте

Поэтому я попытался использовать join() после разделения строки на слова и знаки препинания, но он объединяет строку с пробелом между словом и знаком препинания.

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

Но это возвращает:
c = 'Hello , who are you ?'

и я хочу:
c = 'Hello, who are you?'


person user2270501    schedule 11.04.2013    source источник
comment
Работает ли вызов метода для пустой строки?   -  person CBroe    schedule 11.04.2013
comment
@CBroe: Нет, потому что вместо этого вы получаете 'Hello,whoareyou?'..   -  person Martijn Pieters    schedule 11.04.2013
comment
Да правильно. Так что простое соединение не подойдет, потому что есть разные «типы» данных, слов и знаков препинания. Поэтому я предполагаю, что нужен самописный метод, который сначала проверяет, какой из них есть, а затем объединяет части с пробелом или без пробела соответственно.   -  person CBroe    schedule 11.04.2013


Ответы (4)


Вы можете сначала присоединиться к пунктуации:

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))

Генератор join_punctuation выдает строки с уже добавленными следующими знаками препинания:

>>> b = ['Hello', ',', 'who', 'are', 'you', '?']
>>> list(join_punctuation(b))
['Hello,', 'who', 'are', 'you?']
>>> ' '.join(join_punctuation(b))
'Hello, who are you?'
person Martijn Pieters    schedule 11.04.2013

Делайте это после того, как получите результат, не полный, но работающий...

c = re.sub(r' ([^A-Za-z0-9])', r'\1', c)

Выход:

c = 'Hello , who are you ?'
>>> c = re.sub(r' ([^A-Za-z0-9])', r'\1', c)
>>> c
'Hello, who are you?'
>>> 
person ATOzTOA    schedule 11.04.2013
comment
Хороший вариант, за исключением того, что re.sub(r' (?=\W)', '', c) будет проще. - person georg; 11.04.2013

Может быть, что-то вроде:

>>> from string import punctuation
>>> punc = set(punctuation) # or whatever special chars you want
>>> b = ['Hello', ',', 'who', 'are', 'you', '?']
>>> ''.join(w if set(w) <= punc else ' '+w for w in b).lstrip()
'Hello, who are you?'

Это добавляет пробел перед словами в b, которые не состоят полностью из пунктуации.

person DSM    schedule 11.04.2013

Как насчет

c = " ".join(b).replace(" ,", ",")
person Rakesh    schedule 11.04.2013
comment
Вам нужно сделать то же самое для знака вопроса ?, и может быть больше типов пунктуации. - person Martijn Pieters; 11.04.2013