regex 找出辅音之间的每两个(不重叠)元音

8xiog9wr  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(121)

任务你有一个字符串。它由字母数字字符、空格和符号(+,-)组成。你的任务是找出原始字符串中包含两个或更多元音的所有子字符串。另外,这些子字符串必须位于辅音之间,并且只包含元音。
**输入格式:**单行包含字符串的输入。
**输出格式:**在单独的行上按出现的顺序打印匹配的子字符串。如果没有找到匹配,打印-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,}进行分组,我已经将其从捕获中排除,但显然我错了,我不知道为什么。
有人帮忙吗?

8zzbczxx

8zzbczxx1#

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

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

lvjbypge

lvjbypge2#

这里有一个替代的解决方案,它不需要使用特殊的()字符进行分组,而是依赖于一个带有(?〈=...)RE语法的“肯定的lookbehindAssert”:

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

klr1opcd3#

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

相关问题