Как насчет этого:
>>> s
"I'm hope-less and can -not solve this pro- blem on my own. Wo - uld you help me
?"
>>> list(map(lambda x:re.sub(' *- *','',x), filter(lambda x:x, re.split(r'(?<!-) +(?!-)|([.?])',s))))
["I'm", 'hopeless', 'and', 'cannot', 'solve', 'this', 'problem', 'on', 'my', 'own', '.', 'Would', 'you', 'help', 'me', '?']
Выше использовался простой пробел ' '
, но лучше использовать \s
:
list(map(lambda x:re.sub('\s*-\s*','',x), filter(lambda x:x, re.split(r'(?<!-)\s+(?!-)|([.?])',s))))
(?<!-)\s+(?!-)
означает пробелы, которые не-
до или после.
[.?]
означает один .
или ?
.
re.split(r'(?<!-)\s+(?!-)|([.?])',s)
соответственно разделит строку, но будет содержать None
и пустую строку ''
внутри:
["I'm", None, 'hope-less', None, 'and', None, 'can -not', None, 'solve', None, 'this', None, 'pro- blem', None, 'on', None, 'my', None, 'own', '.', '', None, 'Wo - uld', None, 'you', None, 'help', None, 'me', '?', '']
Этот результат был напрямую передан в filter
для удаленияNone
и ''
, а затем введите map
для удаления пробела и -
внутри каждого слова.