任务 给你一个字符串。它由字母数字字符,空格和符号(+, - )组成。 您的任务是查找包含两个或更多元音的原始字符串的所有子字符串。 此外,这些子串必须位于辅音之间,并且只应包含元音。
输入格式:包含字符串的单行输入。
输出格式:按照出现的顺序打印匹配的子字符串 线。如果未找到匹配项,请打印-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,}
我已将其排除在捕获之外,但显然我错了,我无法说明原因。
任何帮助?
答案 0 :(得分:3)
超前方法允许结束一个元音序列的辅音开始下一个序列,而非超前方法需要在这些序列之间至少有两个辅音(一个用于结束序列,另一个用于开始下一个序列,因为两个匹配)。
见
import re
print(re.findall(r'[^aiueo]([aiueoAIUEO]{2,})(?=[^aiueo])', 'moomoom'))
print(re.findall(r'[^aiueo]([aiueoAIUEO]{2,})[^aiueo]', 'moomoom'))
将输出
['oo', 'oo']
['oo']
有点挑剔,对于您的问题描述,这两种尝试都不正确。它们允许大写元音,空格和符号作为分隔符。您可能希望使用[b-df-hj-np-tv-z]
代替[^aeiou]
并使用flags=re.I
答案 1 :(得分:0)
这是一种替代解决方案,不需要使用特殊的()字符进行分组,而是依靠具有(?<= ...)RE语法的“正向隐式断言”:
import re
sol=re.findall(r"(?<=[QWRTYPSDFGHJKLZXCVBNMqwrtypsdfghjklzxcvbnm])[AEIOUaeiou]{2,}(?=[QWRTYPSDFGHJKLZXCVBNMqwrtypsdfghjklzxcvbnm])", input())
if sol:
print(*sol, sep="\n")
else:
print(-1)
答案 2 :(得分:0)
您可以使用re.IGNORECASE
标志re.I
忽略大小写。另外,您可以避免元音,字母数字字符和空格中的数字,问题中提到的+
和-
字符。
import re
vowels = re.findall(r"[^aeiou\d\s+-]([aeiou]{2,})(?=[^aeiou\d\s+-])", input(), re.I)
if len(vowels):
for vowel in vowels:
print(vowel)
else:
print("-1")