найти имя с дополнительными символами между в строке Python - PullRequest
1 голос
/ 30 марта 2019

Я пишу простой код, чтобы найти «привет» в строке, даже если другие символы находятся между ее символами, например: hpepllpoo.Но есть некоторые проблемы.

Мой код:

import re
x = raw_input()

if re.match(r'.*h+e+ll+o+.*',x):
    print ('YES')
else:
    print('NO')

Для некоторых строк, например kdjhslfjhshhhheeellllllooooosadsf print YES, это True.Но есть проблема.Например, моя строка: helhcludoo

Вывод

```NO```

, но я хочу сопоставить его и вывести YES.

Ответы [ 4 ]

0 голосов
/ 30 марта 2019

Я предлагаю другое решение, не используя регулярные выражения.Таким образом, вы можете дать любое слово для поиска.

def check(x, word):
     if not word:
         return "YES"

     for c in x:
         if c == word[0]:
             word = word[1:]
             if not word:
                 return "YES"
     return "NO"

case1 = "kdjhslfjhshhhheeellllllooooosadsf"
case2 = "helhcludoo"
case3 = "nothing here"
case4 = "in between hello here"

assert check(case1, "hello") == "YES"
assert check(case2, "hello") == "YES"
assert check(case3, "hello") == "NO"
assert check(case4, "hello") == "YES"
0 голосов
/ 30 марта 2019

Как сказал @ Жан-Франсуа Фабр, вам нужно регулярное выражение: r'h.*e.*l.*l.*o.*'

Вот реализация с тестовыми примерами для поиска hello в заданной строке:

import re

def check_hello(x):
    if re.search(r'h.*e.*l.*l.*o.*',x):
        return 'YES'
    return 'NO'

case1 = "kdjhslfjhshhhheeellllllooooosadsf"
case2 = "helhcludoo"
case3 = "nothing here"
case4 = "in between hello here"

assert check_hello(case1) == "YES"
assert check_hello(case2) == "YES"
assert check_hello(case3) == "NO"
assert check_hello(case4) == "YES"
0 голосов
/ 30 марта 2019

Другим способом может быть использование класса с отрицательным символом для сопоставления с таким символом, как h, затем сопоставление не следующего символа e 0+ раз [^e]*, а затем сопоставление следующего символа e.

Используя re.match , вы можете использовать:

.*?h[^e]*e[^l]*l[^l]*l[^o]*o

Если вы не хотите сопоставлять символы новой строки, вы можете использовать \n внутри класса отрицанных символов.

Regex demo | Python demo

Например:

strings = [
    "helhcludoo",
    "kdjhslfjhshhhheeellllllooooosadsf",
    "test helo"
]

for x in strings:
    if re.match(r'.*?h[^e]*e[^l]*l[^l]*l[^o]*o',x):
        print ('YES for %s' % x)
    else:
        print ('NO for %s' % x)

Будет напечатано:

YES for helhcludoo
YES for kdjhslfjhshhhheeellllllooooosadsf
NO for test helo
0 голосов
/ 30 марта 2019

Вы можете сделать:

h.*e(?:.*l){2}.*o

Это в основном соответствует нулю или более любых символов (.*) между желаемыми символами.

{num} - сокращение для записи последовательныхповторяющиеся паттерны;здесь, к (?:.*l){2} мы сопоставляем 2 последовательных паттерна .* (помещаем в не захваченную группу (?:)).Таким образом, вы могли бы также написать:

h.*e.*l.*l.*o

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

h.*?e(?:.*?l){2}.*?o

Пример:

In [2112]: re.search(r'h.*e(?:.*l){2}.*o', 'kdjhslfjhshhhheeellllllooooosadsf')                                                                                                                             
Out[2112]: <re.Match object; span=(3, 28), match='hslfjhshhhheeellllllooooo'>

In [2113]: re.search(r'h.*e(?:.*l){2}.*o', 'helhcludoo')                                                                                                                                                    
Out[2113]: <re.Match object; span=(0, 10), match='helhcludoo'>

В своем регулярном выражении вы использовали +, который предназначен длясоответствует одному или нескольким предыдущим токенам, например, e+ соответствует одному или нескольким e;следовательно, ваш Regex не сможет найти нужную подстроку.

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