Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Исключение определенного символа из куска строки на Python

wormwood Профи (729), на голосовании 5 дней назад
Есть список со строками - словами. Я пишу программу, которая берет любое слово из списка, а из этого слова берет кусок, т.е. вырезает буквосочетание - например, из слова яблоко она может взять куски "яб", "ло", "ок", "бло" и т.п. Но в списке у есть слова, которые пишутся через дефис - например, мать-и-мачеха, светло-зеленый или же предлоги, пишущиеся с дефисом. Тогда программа может вырезать из слова кусок вместе дефисом, и результат выйдет примерно такой - "-и-", "-ма", "о-з" и т.п. Как написать код так, чтобы программа при взятии куска из строки исключала наличие в получившейся строке дефиса? Нужно ли использовать 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
мат
Голосование за лучший ответ
Леонтьев Михаил Мастер (2300) 1 месяц назад
Вы можете реализовать эту задачу без использования регулярных выражений. Вам нужно просто генерировать подстроки и проверять, содержат ли они дефис. Вот пример кода, который делает это:

```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)

print(f"Слово: {word}")
print(f"Подстрока: {result}")
```

### Объяснение:

1. **Цикл `while True`:** Будет продолжаться до тех пор, пока не будет сгенерирована подстрока без дефиса.
2. **Генерация индексов:** Случайным образом выбираем начальный и конечный индексы для извлечения подстроки.
3. **Проверка на дефис:** Если в подстроке нет дефиса, она возвращается; если есть, процесс повторяется.

Этот подход будет работать эффективно и просто, не требуя сложных регулярных выражений.
wormwoodПрофи (729) 1 месяц назад
"if '-' not in substring"? If ... not in работает же только для коллекции О_о
wormwood Профи (729) wormwood, Хотя нет, и без коллекции работает тоже, но все равно алгоритм работает с ошибками
Терр Онтал Мудрец (12801) 1 месяц назад
Есть функция trim, она может обрезать заданные символы по краям строки. Но я бы на твоём месте пересмотрел алгоритм вырезания из слова. Там нужно как-то учесть случай с дефисами
wormwoodПрофи (729) 1 месяц назад
Вот я именно и пытаюсь понять, как написать код так, чтобы он находил определенный символ и его исключал. В голову приходит только с помощью регекса искать в строке дефис, но им я пользоваться не умею, тем более в пайтон
Терр Онтал Мудрец (12801) wormwood, а как конкретно твой алгоритм работает? Как он вырезает подстроки? И как он понимает, что нужно вырезать?
°••°••°••°••°••°••°••°••°••° Гуру (2634) 1 месяц назад
Как вариант, брать строку с дефисами, разбить ее на список, где разделителем будет дефис, а потом собрать
Похожие вопросы