2013-04-11 5 views
2

Итак, я попытался использовать join() после разделения строки на слова и пунктуацию, но она соединяет строку с пробелом между словом и пунктуацией.Присоединение разделенных слов и пунктуации с пунктуацией в нужном месте

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

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

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

+0

Выполняет вызов метода на пустой строке? – CBroe

+0

@CBroe: Нет, потому что тогда вы получите «Привет, кто вы?» Вместо этого. –

+2

Да, правильно. Поэтому простого соединения не будет, потому что существуют разные «типы» данных, слов и пунктуации. Поэтому я предполагаю, что для этого нужен самозанятый метод, который сначала проверяет, какой из них он есть, а затем соединяет части с пространством или без пространства соответственно. – CBroe

ответ

1

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

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?' 
+0

О, ладно! оно работает. спасибо кучи. – user2270501

0

Как Абт

c = " ".join(b).replace(" ,", ",") 
+0

Вам нужно сделать то же самое для вопросительного знака '?', И может быть больше типов пунктуации. –

1

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

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?' 
>>> 
+0

Хорошо, за исключением того, что 're.sub (r '(? = \ W)', '', c)' будет проще. – georg

+0

@ thg435 да, правильно. – ATOzTOA

0

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

>>> 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, которые не состоят исключительно из знаков препинания.