Нарезка строки регулярным выражением в re Python

Рейтинг: 0Ответов: 4Опубликовано: 04.03.2023

Как, желательно дополнив или несильно изменив имеющееся регулярное выражение, заставить его правильно работать? Необходимо использовать только re.split!!!

import re
def words_discharge(text):
    return re.split(r'[^\w-]+', text)
print(words_discharge('''Он --- серо-буро-малиновая редиска!! 
                      >>>:-> 
                      А не кот. 
                      www.kot.ru'''))

в таком виде ответ выглядит:

['Он', '---', 'серо-буро-малиновая', 'редиска', '-', 'А', 'не', 'кот', 'www', 'kot', 'ru']

а нужно, чтобы было:

['Он', 'серо-буро-малиновая', 'редиска', 'А', 'не', 'кот', 'www', 'kot', 'ru']

попытки добавить исключение знаку дефис: '-(?!/w)', '-(?=\w)' ни к чему хорошему не приводят :( Заранее благодарю за любую помощь!

Ответы

▲ 0Принят

Вариант со сплитом. Режет по двум и более подряд небуквенным символам ИЛИ по единичному небуквенному, кроме дефиса.

import re
def words_discharge(text):
    return re.split(r'\W{2,}|[^\w-]', text)
print(words_discharge('''Он --- серо-буро-малиновая редиска!! 
                      >>>:-> 
                      А не кот. 
                      www.kot.ru'''))
['Он', 'серо-буро-малиновая', 'редиска', 'А', 'не', 'кот', 'www', 'kot', 'ru']
▲ 0

Можно поменяв split на findall

import re
def words_discharge(text):
    return re.findall(r'(?!-)[\w-]+', text)
print(words_discharge('''Он --- серо-буро-малиновая редиска!! 
                      >>>:-> 
                      А не кот. 
                      www.kot.ru'''))

------------------------------

['Он', 'серо-буро-малиновая', 'редиска', 'А', 'не', 'кот', 'www', 'kot', 'ru']
▲ 0
print(re.findall(r'[а-яА-Яa-zA-Z]+', u'''Он --- серо-буро-малиновая редиска!! 
                      >>>:-> 
                      А не кот. 
                      www.kot.ru'''))

['Он', 'серо', 'буро', 'малиновая', 'редиска', 'А', 'не', 'кот', 'www', 'kot', 'ru']
▲ 0

Просто удалите все элементы списка, состоящие целиком из дефисов:

def words_discharge(text):
    return [x for x in re.split(r'[^\w-]+', text) if x.replace('-','')]

См. пример выполнения кода:

import re
 
def words_discharge(text):
    return [x for x in re.split(r'[^\w-]+', text) if x.replace('-','')]
 
print(words_discharge('''Он --- серо-буро-малиновая редиска!! 
                      >>>:-> 
                      А не кот. 
                      www.kot.ru'''))
# => ['Он', 'серо-буро-малиновая', 'редиска', 'А', 'не', 'кот', 'www', 'kot', 'ru']