Я знаю, что могу найти слово в строке с

if word in my_string:

Но я хочу найти все «слово» в строке, как это.

counter = 0
while True:
    if word in my_string:
        counter += 1

Как я могу сделать это, не считая одно и то же слово снова и снова?

1
Kaiser 17 Дек 2015 в 03:09

4 ответа

Лучший ответ

Если вы хотите убедиться, что он считает полное слово, например, is будет иметь только одно слово в this is, даже если в this есть is, вы можете разделить, отфильтровать и считать:

>>> s = 'this is a sentences that has is and is and is (4)'
>>> word = 'is'
>>> counter = len([x for x in s.split() if x == word])
>>> counter
4

Однако, если вы просто хотите сосчитать все вхождения подстроки, то есть is также будет соответствовать is in this, тогда:

>>> s = 'is this is'
>>> counter = len(s.split(word))-1
>>> counter
3

Другими словами, split строка в каждом вхождении слова, затем минус один, чтобы получить счетчик.

Редактировать - просто использовать счет:

Это был долгий день, поэтому я полностью забыл, но у str есть встроенный метод для этого str.count(substring), который делает то же самое, что и мой второй ответ, но гораздо более читабелен. Пожалуйста, подумайте об использовании этого метода (и посмотрите на ответы других людей, как это сделать)

3
R Nar 17 Дек 2015 в 00:27

Используйте аргумент beg для метода .find.

counter = 0
search_pos = 0
while True:
    found = my_string.find(word, search_pos)
    if found != -1: # find returns -1 when it's not found
        #update counter and move search_pos to look for the next word
        search_pos = found + len(word)
        counter += 1
    else:
        #the word wasn't found
        break

Это своего рода решение общего назначения. В частности, для подсчета в строке вы можете просто использовать my_string.count(word)

1
Chad S. 17 Дек 2015 в 00:18

Строка уже имеет ту функциональность, которую вы ищете. Вам просто нужно использовать str.count(item) например.

РЕДАКТИРОВАТЬ: Это будет искать все вхождения указанной строки, включая части слов.

string_to_search = 'apple apple orange banana grapefruit apple banana'

number_of_apples = string_to_search.count('apple')
number_of_bananas = string_to_search.count('banana')

Следующее будет искать только полные слова, просто разбить строку, которую вы хотите найти.

string_to_search = 'apple apple orange banana grapefruit apple banana'.split()

number_of_apples = string_to_search.count('apple')
number_of_bananas = string_to_search.count('banana')
2
OnGle 17 Дек 2015 в 00:18

Используйте регулярные выражения:

import re

word = 'test'
my_string = 'this is a test and more test and a test'

# Use escape in case your search word contains periods or symbols that are used in regular expressions.
re_word = re.escape(word)

# re.findall returns a list of matches
matches = re.findall(re_word, my_string)

# matches = ['test', 'test', 'test']
print len(matches) # 3

Имейте в виду, что это поймает другие слова, содержащие ваше слово, такие как testing. Вы можете изменить свое регулярное выражение, чтобы оно точно соответствовало вашему слову

0
Brendan Abel 17 Дек 2015 в 00:27