Как использовать регулярные выражения для поиска многоточия?

Рейтинг: 0Ответов: 1Опубликовано: 27.03.2023
#Имеем текст
text = '''Шла Саша, значит, по шоссе и сосала... сушку!'''

#Имеем функцию, которая возвращает подстроку из строки, 
#Принимающая след.значения: текст[text]; номер первого элемента 
#подстроки[start]; Длину подстроки[size]. 
#Вне зависимости от размера size подстрока не должна обрываться.
#Она должна обязательно оканчиваться на знак препинания. Любой. 
#То есть многоточие не должно обрываться, а должно полностью войти в подстроку.
#Либо поиск [i-1] знака препинания должен "шагать" дальше, 
#пока "не упрется" в запятую.

def func(text: str, start: int, size: int) -> tuple(str, int):
        result = re.findall([регулярное выражение для поиска], text)
        print(result)
        symbols = ('.', ',', ':', ';', '!', '?')
        end = min(start + size, len(text))
        for i in range(end, start, -1):
                if text[i-1] in symbols or text[i-1] == result:
                        page = text[start:i].rstrip()
                        return page, len(page)

#Вывод подстроки и её длинны.     
print(func(text, 0, 37), sep='\n')

Прошу помочь!)))

Ответы

▲ 3

Точка это спецсимвол регулярки обозначающий любой символ, поэтому нужно либо так [.]{3} в скобках символы не нуждаются в экранировании {3} - длина, либо так \.\.\. тут мы экранируем точки \ таким образом они воспринимаются уже как обычный символ точки.

import re

text = "Шла Саша, значит, по шоссе и сосала... сушку!"
matches = re.finditer(r"\.\.\.", text, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):
    print ("Найдено {matchNum} в позиции {start}-{end}: {match}"
      .format(matchNum = matchNum, start = match.start(), 
        end = match.end(), match = match.group()))

# Найдено 1 в позиции 35-38: ...