Код
import re
def get_words(s):
pattern = r'(?:^|(?<=\s))[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)?(?:$|(?=\s))'
return ' '.join(re.findall(pattern, s))
Пояснение
(?:^|(?<=\s)) - matches beginning of word or space
(?:$|(?=\s)) - matches end of string or space
[a-zA-Z0-9]+ - one or more letters or numbers
[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)? - matches letters/numbers and optionally followed
by hypen followed by letters and numbers
(so only accepts single hyphens between letters or numbers)
Код теста
s1 = "(black re-d whit.e yellow, blue[p].o orange) green"
s2 = "but, I am so tired."
s3 = "in the years 1902-1905 or was it 1904, or 1905"
s4 = """And underneath the guy on the horse’s picture, it always says: ‘Since 1888 we have been molding boys into splendid, clear-thinking young men."""
for i, s in enumerate([s1, s2, s3, s4]):
print(f'Test {i}: {s}\nOutput:{get_words(s)}\n')
Результат
Тест 0: (черный красный с желтым, синий [p] .o оранжевый) зеленый
Выход: повторно d зеленый
Тест 1: но я так устал.
Вывод: я такой
Тест 2: в годах 1902-1905 или это было 1904, или 1905
Выход: в годы 1902-1905 или это было или 1905
Тест 3: И под парнем на На изображении лошади всегда написано: «С 1888 года мы лепили мальчиков в великолепных, ясных и умных юношей.
Вывод: А под парнем на нем всегда 1888 год мы лепили мальчиков в здравомыслящий молодой