在辅音

时间:2017-07-05 14:06:26

标签: python regex python-3.x

  

任务    给你一个字符串。它由字母数字字符,空格和符号(+, - )组成。    您的任务是查找包含两个或更多元音的原始字符串的所有子字符串。    此外,这些子串必须位于辅音之间,并且只应包含元音。

     

输入格式:包含字符串的单行输入。

     

输出格式:按照出现的顺序打印匹配的子字符串   线。如果未找到匹配项,请打印-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 个答案:

答案 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']

https://ideone.com/2Wn1TS

有点挑剔,对于您的问题描述,这两种尝试都不正确。它们允许大写元音,空格和符号作为分隔符。您可能希望使用[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")