Есть список со строками - словами. Я пишу программу, которая берет любое слово из списка, а из этого слова берет кусок, т.е. вырезает буквосочетание - например, из слова яблоко она может взять куски "яб", "ло", "ок", "бло" и т.п. Но в списке у есть слова, которые пишутся через дефис - например, мать-и-мачеха, светло-зеленый или же предлоги, пишущиеся с дефисом. Тогда программа может вырезать из слова кусок вместе дефисом, и результат выйдет примерно такой - "-и-", "-ма", "о-з" и т.п. Как написать код так, чтобы программа при взятии куска из строки исключала наличие в получившейся строке дефиса? Нужно ли использовать regex или можно написать такой код, что если кусок выходит с дефисом, происходила повторная генерация, пока не получится строка без дефиса?
Дополнен 1 месяц назад
Большое всем спасибо, разобралась, как это реализовать, код вышел такой:
import random
word1 = input('> ')
def prompt_from_word(word): if '-' not in word: sequence_length = random.randint(2, 3) if sequence_length == 3: crop_start = random.randint(0, len(word) - 3) print(f'Точка отсчета: {crop_start}') else: crop_start = random.randint(0, len(word) - 2) print(f'Точка отсчета: {crop_start}') crop = word[crop_start:crop_start+sequence_length] return crop else: no_hyphen = word.split('-') print(f'Массив из частей слова: {no_hyphen}') no_shorts = [item for item in no_hyphen if len(item) > 2] picked_part = no_shorts[random.randint(0, len(no_shorts)-1)] print(f'Выбранная часть из массива: {picked_part}') if len(picked_part) < 3: sequence_length = 3 else: sequence_length = random.randint(2, 3) if sequence_length == 3: crop_start = random.randint(0, len(picked_part) - 3) print(f'Точка отсчета: {crop_start}') else: crop_start = random.randint(0, len(picked_part) - 2) print(f'Точка отсчета: {crop_start}') crop = picked_part[crop_start:crop_start+sequence_length] return crop
print(prompt_from_word(word1))
Вот что выдает в результате как пример: > мать-и-мачеха Массив из частей слова: ['мать', 'и', 'мачеха'] Выбранная часть из массива: мать Точка отсчета: 0 мат
Вы можете реализовать эту задачу без использования регулярных выражений. Вам нужно просто генерировать подстроки и проверять, содержат ли они дефис. Вот пример кода, который делает это:
```python import random
def get_substring_without_hyphen(word): while True: # Генерируем случайные начальный и конечный индексы start = random.randint(0, len(word) - 1) end = random.randint(start + 1, len(word)) # end должен быть больше start
# Извлекаем подстроку substring = word[start:end]
# Проверяем, есть ли в подстроке дефис if '-' not in substring: return substring
# Пример списка слов words = ["яблоко", "мать-и-мачеха", "светло-зеленый", "предлог", "стол"]
# Генерируем подстроку для случайного слова из списка word = random.choice(words) result = get_substring_without_hyphen(word)
1. **Цикл `while True`:** Будет продолжаться до тех пор, пока не будет сгенерирована подстрока без дефиса. 2. **Генерация индексов:** Случайным образом выбираем начальный и конечный индексы для извлечения подстроки. 3. **Проверка на дефис:** Если в подстроке нет дефиса, она возвращается; если есть, процесс повторяется.
Этот подход будет работать эффективно и просто, не требуя сложных регулярных выражений.
Есть функция trim, она может обрезать заданные символы по краям строки. Но я бы на твоём месте пересмотрел алгоритм вырезания из слова. Там нужно как-то учесть случай с дефисами
Вот я именно и пытаюсь понять, как написать код так, чтобы он находил определенный символ и его исключал. В голову приходит только с помощью регекса искать в строке дефис, но им я пользоваться не умею, тем более в пайтон
Терр Онтал
Мудрец
(12801)
wormwood, а как конкретно твой алгоритм работает? Как он вырезает подстроки? И как он понимает, что нужно вырезать?