Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

Последовательный подсчет слов в строке

#python #регулярные_выражения #list


Задача: вывести True, если в строке последовательно находятся три слова, в противном
случае вывести False. В строке есть числа и слова. Мой код некорректно работает в случае
если между словами расположены числа. Добавление условия result != [] не решило проблему,
а больше идей у меня нет. 

import re
def checkio(words: str) -> bool:
    str_ = words.split()
    sum_ = 0
    for i in str_:
        result = re.findall(r'[\w*\']+', i)
        if len(result)!=0 and result != []:
            sum_ = sum_+ 1
    if sum_ >= 3:
        return True
    else:
        return False    


#These "asserts" using only for self-checking and not necessary for auto-testing
if __name__ == '__main__':
    print('Example:')
    print(checkio("Hello World hello"))

    assert checkio("Hello World hello") == True, "Hello"
    assert checkio("He is 123 man") == False, "123 man"
    assert checkio("1 2 3 4") == False, "Digits"
    assert checkio("bla bla bla bla") == True, "Bla Bla"
    assert checkio("Hi") == False, "Hi"
    print("Coding complete? Click 'Check' to review your tests and earn cool rewards!")


Заранее спасибо за помощь.
    


Ответы

Ответ 1



Решение с помощью регулярного выражения: import re def checkio(words: str) -> bool: return bool(re.match(r'.*[a-zA-Z]+\s+[a-zA-Z]+\s+[a-zA-Z]+.*', words)) Тесты: print(checkio('13 holy hand grenade')) # True print(checkio('holy grenade')) # False print(checkio('13 666 777')) # False print(checkio(' eggs eggs eggs ')) # True print(checkio('spam 13 spam spam')) # False print(checkio('eggs 13 eggs eggs eggs')) # True print(checkio('spam13 eg_gs eggs')) # False

Ответ 2



Логика: for i in str_: если слово: # if not i.isdigit(): или регуляркой sum_ = sum_+ 1 if sum_ >= 3: return True else: sum_ = 0 return False

Ответ 3



А обязательно регуляркой? можно ещё так, например: import itertools as it def checkit(a: str): if len(list(it.takewhile(lambda x: not x.isnumeric(), a.split())))>2: return True else: return False checkit('hello1 1 world hello 2') #False checkit('hello1 world hello 2') #True

Ответ 4



C использованием регулярного выражения (выбирает три подряд идущих слова, которые могут содержать цифры, но не должны быть числом): import re def checkio(words: str) -> bool: return bool(re.findall(r'(?:\b(?:\d+[^\d\s]\w*|[^\s\d]\w+)\b\s*){3}', words)) #These "asserts" using only for self-checking and not necessary for auto-testing if __name__ == '__main__': print('Example:') assert checkio("Hello World hello") == True, "Hello" assert checkio("He is 123 man") == False, "123 man" assert checkio("1 2 3 4") == False, "Digits" assert checkio("bla bla bla bla") == True, "Bla Bla" assert checkio("Hi") == False, "Hi" assert checkio("13 holy hand grenade") == True, "grenade1" assert checkio("holy grenade") == False, "grenade2" assert checkio("13 666 777") == False, "Digits" assert checkio(" eggs eggs eggs ") == True, "eggs1" assert checkio("spam 13 spam spam") == False, "spam" assert checkio("eggs 13 eggs eggs eggs") == True, "eggs2" assert checkio("spam13 eg_gs eggs") == True, "eggs3" print("Coding complete? Click 'Check' to review your tests and earn cool rewards!") Обновил: шаблон, для поддержки слов, содержащих цифры. Заменил re.match() -> re.findall()

Комментариев нет:

Отправить комментарий