A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
pythontutor_task_solutions / Занятие 05. Строки
- Go to file T
- Go to line L
- Copy path
- Copy permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Cannot retrieve contributors at this time
173 lines (117 sloc) 6.78 KB
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents Copy raw contents
Copy raw contents
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
- Copy lines
- Copy permalink
- View git blame
- Reference in new issue
Источник: github.com
Урок 6 Ввод и вывод данных Python. Функция print() Python
Найти первое слово в строке Python
Я должен написать одну функцию, которая должна возвращать первое слово в следующих строках:
(«Hello world») -> return «Hello» (» a word «) -> return «a» («don’t touch it») -> return «don’t» («greetings, friends») -> return «greetings» («. and so on . «) -> return «and» («hi») -> return «hi»
Все должны возвращать первое слово, и, как вы можете видеть, некоторые начинаются с пробела, имеют апострофы или заканчиваются запятыми.
Я использовал следующие параметры:
return text.split()[0] return re.split(r’w*, text)[0]
Обе ошибки в некоторых строках, так кто мне может помочь .
T.Python 4 Янв 2018 в 13:56
5 ответов
Лучший ответ
Сложно различать апострофы, которые должны быть частью слова, и одинарные кавычки, которые являются пунктуацией для синтаксиса. Но так как ваши входные примеры не показывают одинарные кавычки, я могу пойти с этим:
re.match(r’W*(w[^,. !?»]*)’, text).groups()[0]
Для всех ваших примеров это работает. Это не будет работать для нетипичных вещей вроде «’tis all in vain!» . Предполагается, что слова заканчиваются запятыми, точками, пробелами, пробелами, вопросительными знаками и двойными кавычками. Этот список может быть расширен по требованию (в скобках).
Alfe 4 Янв 2018 в 11:13
Решение без регулярных выражений: удаление начальных знаков препинания / пробелов, разбиение строки для получения первого слова, затем удаление конечных знаков препинания / пробелов:
Python. Команды print() input()
from string import punctuation, whitespace def first_word(s): to_strip = punctuation + whitespace return s.lstrip(to_strip).split(‘ ‘, 1)[0].rstrip(to_strip) tests = [ «Hello world», «a word», «don’t touch it», «greetings, friends», «. and so on . «, «hi»] for test in tests: print(‘#<>#’.format(first_word(test)))
#Hello# #a# #don’t# #greetings# #and# #hi#
Источник: question-it.com
Получение первого слова из строки
Изучаю python, есть задачка — получить первое слово из строки. Строка может начинаться с пробелов, точек и т.д ( «. пример, строки » ). Нужна функция, которая вернет слово «пример» . Мой код в котором получилось получить слово, но избавиться от запятой не получается :
def splitText(string: str): splitted = string.split() for x in range(len(splitted)): if splitted[x].isalpha(): print(splitted[x]) break
splitText(«Hello world»)
выведет «Hello» , но если строка будет вида «Hello, world» , то выведет «world»
Отслеживать
5,668 3 3 золотых знака 21 21 серебряный знак 44 44 бронзовых знака
задан 20 ноя 2017 в 19:22
74 1 1 золотой знак 1 1 серебряный знак 8 8 бронзовых знаков
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
В таком подходе будут найдены все слова:
>>> import re >>> word = ‘. пример, строки’ >>> pattern = re.compile(r’w+’) >>> pattern.findall(word)[0] ‘пример’
В таком, только первое совпадение:
>>> pattern.search(word).group() ‘пример’
Пример без регулярок:
>>> for i in word: . if not i.isalpha() and i != ‘ ‘: . word = word.replace(i, ») . >>> word ‘ пример строки’ >>> word.split()[0].strip() ‘пример’
Отслеживать
ответ дан 20 ноя 2017 в 19:37
Pavel Durmanov Pavel Durmanov
5,668 3 3 золотых знака 21 21 серебряный знак 44 44 бронзовых знака
Спасибо, до регулярок еще не дошел!
20 ноя 2017 в 19:43
20 ноя 2017 в 19:45
и как ваш пример без регулярок справится с текстом типа «,п.р.и.м.е!р строки» =D? родит слово которого не было из частокола точек и букв?
20 ноя 2017 в 20:16
20 ноя 2017 в 20:20
#!/usr/bin/env python3 import re text = ‘. пример, строки’ first_word = re.findall(r’w+’, text)[0]
это подходит для коротких текстов. Для больших текстов, чтобы искать только первое слово вместо всех сразу:
first_word = next(m.group() for m in re.finditer(r’w+’, text))
Без регулярных выражений, itertools алгоритмов, итд это можно выразить как:
def first_word(text): it = iter(text) for char in it: if char.isalnum(): # found first char word = [char] for char in it: # start with second char if char.isalnum(): word.append(char) else: break return ».join(word) raise ValueError(«no words»)
>>> first_word(‘. пример, строки’) ‘пример’
Код пользуется тем что итераторы в Питоне являются однопроходными, поэтому второй цикл for char in it начинает со второго символа в слове (где предыдущий цикл остановился). Просто for char in text начинает каждый раз с начала с первого символа, если text это последовательность (строка в данном случае).
Отслеживать
ответ дан 20 ноя 2017 в 20:40
51.9k 11 11 золотых знаков 107 107 серебряных знаков 308 308 бронзовых знаков
first_word = lambda text: text.replace(‘.’, »).replace(‘,’, »).strip().split(‘ ‘)[0]
Этот вариант сработает на тексте «Don’t eat it». А приведенные выше решения — нет )))
Отслеживать
ответ дан 30 ноя 2017 в 21:41
Vasyl Kolomiets Vasyl Kolomiets
3,971 5 5 золотых знаков 24 24 серебряных знака 45 45 бронзовых знаков
Ничто не мешает добавить в регулярное выражение обработку апострофа: r»[w’]+» . В вашем варианте, кстати, не учитывается что если второе отделено от первого просто запятой или точкой, то они сольются вместе.
1 дек 2017 в 5:17
1 дек 2017 в 7:33
как на слова текст разбить, зависит от задачи. Можно разные задачи придумывать (к примеру, «J.R.R. Tolkien» ). Стандартный алгоритм из nltk пакета возвращает первое слово do (don’t воспринимается как сокращение от «do not»): nltk.tokenize.word_tokenize(«Don’t eat it») -> [‘Do’, «n’t», ‘eat’, ‘it’] .
1 дек 2017 в 19:24
# как-то так def first_word(text: str) -> str: # функция ниже убирает лишние точки и запятые в слове def removeExtraSymbols(text: str) -> str: result = text.replace(‘.’, ») result = result.replace(‘,’, ») return result allWords = text.split() # разбиваем на слова по пробелу for word in allWords: # пробежимся по всем «словам» в предложении if not removeExtraSymbols(word) == »: # если после удаления лишних символов у нас есть буквы if «.» in word: # если нам подсунули Hello.World (без пробела после точки) word = word.split(«.»)[0] # берем только первое слово перед точкой if «,» in word: # если нам подсунули Hello,World (без пробела после запятой) word = word.split(«,»)[0] # берем только первое слово перед запятой return removeExtraSymbols(word) # возвращаем слово без символов
Отслеживать
ответ дан 27 ноя 2022 в 22:38
Highly active question. Earn 10 reputation (not counting the association bonus) in order to answer this question. The reputation requirement helps protect this question from spam and non-answer activity.
- python
- python-3.x
-
Важное на Мете
Связанные
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Источник: ru.stackoverflow.com