任务你有一个字符串。它由字母数字字符、空格和符号(+,-)组成。你的任务是找出原始字符串中包含两个或更多元音的所有子字符串。另外,这些子字符串必须位于辅音之间,并且只包含元音。
**输入格式:**单行包含字符串的输入。
**输出格式:**在单独的行上按出现的顺序打印匹配的子字符串。如果没有找到匹配,打印-1。
样本输入:rabcdeefgyYhFjkIoomnpOeorteeeeet
示例输出:
ee
Ioo
Oeo
eeeee
上述挑战来自https://www.hackerrank.com/challenges/re-findall-re-finditer
以下代码通过了所有测试用例:
import re
sol = re.findall(r"[^aiueo]([aiueoAIUEO]{2,})(?=[^aiueo])", input())
if sol:
for s in sol:
print(s)
else:
print(-1)
以下内容则不然。
import re
sol = re.findall(r"[^aiueo]([aiueoAIUEO]{2,})[^aiueo]", input())
if sol:
for s in sol:
print(s)
else:
print(-1)
它们之间唯一的区别是正则表达式的最后一位。我不明白为什么第二个代码失败。我认为?=
是无用的,因为通过对[aiueoAIUEO]{2,}
进行分组,我已经将其从捕获中排除,但显然我错了,我不知道为什么。
有人帮忙吗?
3条答案
按热度按时间8zzbczxx1#
前瞻方法允许结束一个元音序列的辅音开始下一个序列,而非前瞻方法要求在这些序列之间至少有两个辅音(一个结束一个序列,另一个开始下一个序列,因为两者都匹配)。
见
它将输出
https://ideone.com/2Wn1TS
需要指出的是,这两种尝试对于您的问题描述都不正确。它们允许大写元音、空格和符号作为分隔符。您可能希望使用
[b-df-hj-np-tv-z]
代替[^aeiou]
,并使用flags=re.I
lvjbypge2#
这里有一个替代的解决方案,它不需要使用特殊的()字符进行分组,而是依赖于一个带有(?〈=...)RE语法的“肯定的lookbehindAssert”:
klr1opcd3#
您可以使用
re.IGNORECASE
我们的re.I
标志来忽略大小写敏感性。此外,您可以避免元音、字母数字字符中的数字以及问题中提到的空格、+
和-
字符。