在字符串python中查找带有多余字符的名称

时间:2019-03-30 11:41:13

标签: python regex python-3.x

我正在编写一个简单的代码来在字符串中查找“ hello”,即使其他字符位于其字符之间,例如:hpepllpoo。 但是有一些问题。

我的代码是:

import re
x = raw_input()

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

对于某些字符串,例如kdjhslfjhshhhheeellllllooooosadsf打印YES为True。 但有一个问题。例如,我的字符串是: helhcludoo

输出为

```NO```

但是我想匹配它并打印YES

4 个答案:

答案 0 :(得分:0)

您可以这样做:

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显然不会与所需的子字符串匹配。

答案 1 :(得分:0)

正如@Jean-FrançoisFabre所说,您需要正则表达式: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"

答案 2 :(得分:0)

另一种方法可能是使用negated character类来匹配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

答案 3 :(得分:0)

我提出了另一种解决方案,不使用正则表达式。这样,您就可以给出任何单词来查找。

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"