Виявлення випадків слова в рядку в python 3

Я намагаюся знайти рядок входження слова в рядок.

word = "dog"
str1 = "the dogs barked"

Для розрахунку випадків я використовував наступне:

count = str1.count(word)

Питання полягає в тому, що я хочу точного збігу. Отже, кількість цього речення складатиме 0. Це можливо?

11

9 Відповіді

Якщо ви йдете для ефективності:

import re
count = sum(1 for _ in re.finditer(r'\b%s\b' % re.escape(word), input_string))

Для цього не потрібно створювати проміжні списки (на відміну від split() ) і, таким чином, будуть працювати ефективно для великих значень input_string .

Він також має перевагу правильної роботи з пунктуацією - він правильно поверне 1 як підрахунок для фрази "Майк побачив собаку". (тоді як аргументований split() не буде). Він використовує прапорець regex \ b , що відповідає межам слова (переходи між \ w aka [a-zA-Z0-9 _] і будь-що інше).

Якщо вам потрібно турбуватися про мови, що не входять до набору символів ASCII, вам може знадобитися коригувати регулярний вираз, щоб правильно відповідати символами, що не містять слів, на цих мовах, але для багатьох програм це було б надмірністю, а в багатьох інших випадках встановлювати Unicode і/або регіональних прапорців для регулярного висвітлення було б достатньо.

18
додано
@ lost9123193 _ часто використовується як заповнювач для циклів :). Я впевнений, що Амбер міг пояснити це краще: р
додано Автор TerryA, джерело
Нижня точка була для попереднього втілення невірної відповіді.
додано Автор Lennart Regebro, джерело
Також, якщо вам цікаво, що біт re - документи . python.org/2/library/re.html
додано Автор Amber, джерело
@ lost9123193 - _ - це просто фіктивна змінна, спосіб сказати: "Мені фактично не турбує значення тут". У цьому випадку я використовую його, оскільки ми завжди підбираємо підрахунок 1 s; Насправді ми не дбаємо про об'єкти відповідності, які повернулися з re.finditer() .
додано Автор Amber, джерело
працював як чарівність! Не впевнений, чому є низхідне. Не могли б ви пояснити, що саме відбувається, або де я можу шукати це? Я ніколи не бачив для циклу підкреслення. Дякую!
додано Автор lost9123193, джерело
@ Амбер спасибі! Я б також відвернув цю відповідь, якщо б міг: P
додано Автор lost9123193, джерело
@Haidro цікаво, мені доведеться поглянути на це, спасибі!
додано Автор lost9123193, джерело

Ви можете скористатись str.split() перетворити пропозицію в список слів:

a = 'the dogs barked'.split()

Це створить список:

['the', 'dogs', 'barked']

Тоді ви можете підрахувати кількість точних випадків за допомогою list.count() :

a.count('dog')  # 0
a.count('dogs') # 1

Якщо вам потрібно працювати з пунктуацією, ви можете використовувати регулярні вирази. Наприклад:

import re
a = re.split(r'\W', 'the dogs barked.')
a.count('dogs') # 1
8
додано
@grc, Якщо ви хочете порахувати їх як одне, слово, так. Я думаю, це м'який смак. :-)
додано Автор Lennart Regebro, джерело
О, еі, прапорець Unicode - за замовчуванням у Python 3. Так, так. Але я знайшов ще одну потенційну проблему: "Я" буде два слова "я" і "м".
додано Автор Lennart Regebro, джерело
Регулярний вираз "\ W" не зможе виконати будь-які іноземні слова, такі як кафе, що є недоліком.
додано Автор Lennart Regebro, джерело
Це, мабуть, найпростіший спосіб, але зауважте, що він не вдасться створити рядки, які містять пунктуацію біля підрахунку слова.
додано Автор Amber, джерело
@ LennartRegebro не буде виправлено прапорець Unicode?
додано Автор grc, джерело
@LennartRegebro, і є проблема з дефіцитними словами.
додано Автор grc, джерело

Використовуйте розуміння списку:

>>> word = "dog"
>>> str1 = "the dogs barked"
>>> sum(i == word for word in str1.split())
0

>>> word = 'dog'
>>> str1 = 'the dog barked'
>>> sum(i == word for word in str1.split())
1

split() returns a list of all the words in a sentence. Then we use a list comprehension to count how many times the word appears in a sentence.

3
додано
@LennartRegebro Не означає, що ви повинні понизити відповідь. Відповідь правильна
додано Автор TerryA, джерело
Обидва ти заспокоїшся. Тепер, чи могли б ви пояснити, чому ви придумали (щодо того, як "це не є правильною відповіддю")
додано Автор TerryA, джерело
@LennartRegebro Правильні відповіді не слід вводити в підсумку.
додано Автор TerryA, джерело
@LennartRegebro Він відповідає на питання, таким чином, це правильно
додано Автор TerryA, джерело
"Це не дуже добре", будь ласка, скажіть, як я можу покращити :)
додано Автор TerryA, джерело
@jamylak відредаговано :).
додано Автор TerryA, джерело
@Haidro: У заключному звіті про це: Ви можете навести курсор мишею на стрілки вгору та вниз, а також помітити, що вони кажуть. Але інакше, будь-яким способом, продовжуйте корегувати людей, які були членами, у десять разів, аніж ви, як працює Stackoverflow. :-)
додано Автор Lennart Regebro, джерело
Але я приношу вибачення за те, що раніше не помічав, що нетерплячий та той, хто опублікував відповідь, були різними людьми. Якби я це зрозумів, я б негайно дав своє пояснення. Вибачте
додано Автор Lennart Regebro, джерело
@ Хайдро: Ця відповідь не є правильною, для корисного визначення правильності. Це не тести математики, де ви отримуєте очки за те, що в кінці є правильний номер.
додано Автор Lennart Regebro, джерело
@jamylak: Це покладається на int (True) бути 1, що може бути сортовим, але важче зрозуміти, ніж оригінал. І це все ще повільніше, ніж просто називаючи .count() .
додано Автор Lennart Regebro, джерело
@Яйлак: Так. Тому? Це все одно означає, що ви повинні знати це і розглянути його при читанні коду. Це ускладнює розуміння, ніж оригінал. Заявляючи, що це самий пітонічний спосіб зробити це, це патентний нісенітниця.
додано Автор Lennart Regebro, джерело
Ваша реалізація sum() є просто неефективною повторною реалізацією методу count() , який вже існує в списках. Замість цього використовуйте .count (word) .
додано Автор Lennart Regebro, джерело
@LennartRegebro .count краще, я згоден, "Це залежить від int (True) being 1" Ви навіть читали величезне виділене посилання чи ні?
додано Автор jamylak, джерело
Мені це подобається, але ви повинні просто спростити його до sum (i == слово для слова в str1.split ()) . Це буде найбільш пітончим способом зробити це .
додано Автор jamylak, джерело
Щоб хтось зрівняв це: якщо ви збираєтеся зменшити, то, як правило, гарна ідея, принаймні, залишити коментар, пояснюючи чому.
додано Автор Amber, джерело
@LennartRegebro Я спокійний; Ви, здається, думаєте, що я працюю, тому що я не схвалюю те, як ви відповіли, але це не так. Я просто хотів би побачити більш конструктивну взаємодію. Мій оригінальний коментар просто запитував про таке конструктивне коментування; Ви вирішили інтерпретувати це як нетерпляче, коли це було нічим подібним. У будь-якому випадку, це остання коментар у цій конкретній області; У мене немає бажання це зробити. Не соромтеся отримати останнє слово, якщо хочете.
додано Автор Amber, джерело
@LennartRegebro Це не корисна заява. Люди, які публікують відповіді на StackOverflow, часто хочуть навчатися так само, як і люди, які публікують питання; Важливою частиною цього є корисний та дієвий відгук.
додано Автор Amber, джерело

Вам потрібно розділити пропозицію на слова. Для вас, наприклад, ви можете зробити це просто

words = str1.split()

Але для реального використання слів потрібно щось більш просунутий, який також обробляє пунктуацію. Для більшості західних мов ви можете піти, замінюючи всі пунктуації пробілами, перш ніж виконувати str1.split() .

Це буде працювати як на англійській мові, так і на простих випадках, але зауважте, що "я" буде розділений на два слова: "я" і "м", і воно має бути розділено на "я" і "я". Але це може бути надмірним для цієї програми.

Для інших випадків, таких як азійська мова або фактичне використання англійської мови в реальному світі, ви можете використати бібліотеку, в якій ваше слово розщеплюється.

Тоді у вас є список слів, і ви можете зробити це

count = words.count(word)
2
додано
Просто збираюся сказати це зараз, я не зменшився.
додано Автор TerryA, джерело
Добре, я радий це почути.
додано Автор Lennart Regebro, джерело
Ха-ха, тепер це було зведено без жодної причини. Я підозрюю дитинство. ;-) Але у мене вже є більше 20 кілобайт, тому я не проти, анітрохи.
додано Автор Lennart Regebro, джерело
import re

word = "dog"
str = "the dogs barked"
print len(re.findall(word, str))
2
додано
    #counting the number of words in the text
def count_word(text,word):
    """
    Function that takes the text and split it into word
    and counts the number of occurence of that word
    input: text and word
    output: number of times the word appears
    """
    answer = text.split(" ")
    count = 0
    for occurence in answer:
        if word == occurence:
            count = count + 1
    return count

sentence = "To be a programmer you need to have a sharp thinking brain"
word_count = "a"
print(sentence.split(" "))
print(count_word(sentence,word_count))

#output
>>> %Run test.py
['To', 'be', 'a', 'programmer', 'you', 'need', 'to', 'have', 'a', 'sharp', 'thinking', 'brain']
2
>>> 

Створіть функцію, яка приймає два входи, які є фразою тексту та слова. Розбити текст речення на сегмент слів у списку, Потім перевірте, чи підраховане слово в сегментованих словах, і підрахуйте входження як повернення функції.

0
додано

Давайте розглянемо приклад s = "suvotisuvojitsuvo" . Якщо ви хочете зарахувати кількість відмінних значень "suvo" і "suvojit", то використовується метод count() ... розраховується відмінно, тобто.) Ви не рахуєте suvojit до suvo .. вважайте лише одиноким "suvo".

suvocount = s.count("suvo")//#output: 3
suvojitcount = s.count("suvojit") //# output : 1

Тоді знайдіть самотній сьово-кол, який ви повинні зняти з рахунку suvojit.

lonelysuvo = suvocount - suvojicount //# output: 3-1 -> 2
0
додано

Нижче наведено простий приклад, коли ми можемо замінити бажане слово новим словом, а також для потрібної кількості введень:

import string

def censor(text, word):
newString = text.replace(word,"+" * len(word),text.count(word)) print newString print censor("hey hey hey","hey")

output will be : +++ +++ +++

Першим параметром у функції є search_string. Другий - це new_string, який замінить вашу пошукову строку. Третя і остання - кількість входів.

0
додано
що таке?
додано Автор RetroCode, джерело

Це моє рішення за допомогою коментарів:

word = str(input("type the french word chiens in english:"))
str1 = "dogs"
times = int(str1.count(word))
if times >= 1:
    print ("dogs is correct")
else:
    print ("your wrong")
0
додано
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;