我正在编写一个简单的代码来在字符串中查找“ 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
。
答案 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
。
例如:
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"