【问题标题】:Find every two (non-overlapping) vowels inbetween consonants在辅音之间找到每两个(不重叠的)元音
【发布时间】:2017-07-05 14:06:26
【问题描述】:

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

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

输出格式:按出现的顺序分别打印匹配的子字符串 线。如果未找到匹配项,则打印 -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,} 分组,我已经将它排除在捕获之外,但显然我错了,我不知道为什么。

有什么帮助吗?

【问题讨论】:

  • 尝试moomoom 两种方法:) 两者都不完全正确,因为[^aeiou] 允许使用空格、大写元音和特殊符号而不是明确的辅音。
  • @SebastianProske 我想排除大写元音,但忘了。关于空格和其他符号,我只是失败了(显然,测试用例的选择也是如此)。非常感谢你。我测试了moomoom,看看你的意思,但不明白为什么 bootom 代码会失败。

标签: python regex python-3.x


【解决方案1】:

前瞻方法允许结束一个元音序列的辅音开始下一个序列,而非前瞻方法要求这些序列之间至少有两个辅音(一个结束一个序列,另一个开始下一个序列,因为两者匹配)。

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

【讨论】:

  • 为了对此进行扩展,re.findall 会找到不重叠的匹配项。
  • 我认为这正是我所缺少的,来自官方文档: (?=...) 如果 ... 匹配下一个则匹配,但不消耗任何字符串。这称为前瞻断言。例如,Isaac (?=Asimov) 仅在 'Asimov' 之后才匹配 'Isaac'。我错过了“不消耗任何字符串”位,对吗?
【解决方案2】:

这是一种替代解决方案,它不需要使用特殊 () 字符进行分组,而是依赖于具有 (?

import re
sol=re.findall(r"(?<=[QWRTYPSDFGHJKLZXCVBNMqwrtypsdfghjklzxcvbnm])[AEIOUaeiou]{2,}(?=[QWRTYPSDFGHJKLZXCVBNMqwrtypsdfghjklzxcvbnm])", input())
if sol:
    print(*sol, sep="\n")
else:
    print(-1)

【讨论】:

    【解决方案3】:

    您可以使用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")
    

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2020-05-16
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      相关资源
      最近更新 更多