2017-07-05 84 views
4

任務 給出一個字符串。它由字母數字字符,空格和符號(+, - )組成。 您的任務是查找包含兩個或更多元音的原始字符串的所有子字符串。 此外,這些子字符串必須位於輔音之間,只應包含元音。在輔音之間找到每兩個(非重疊)元音

輸入格式:單行輸入包含字符串。

輸出格式:在單獨的 行中按照其出現順序打印匹配的子字符串。如果找不到匹配項,請打印-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

嘗試'用這兩種方法moomoom' :)而且兩者並不完全正確,因爲'[^ aeiou]同時'將使空間,大寫元音字母和特殊符號代替明確的輔音。 –

+0

@SebastianProske我想過排除大寫元音,但忘了。關於空格和其他符號,我簡直失敗了(顯然,測試用例的選擇也是如此)。非常感謝你。我測試了'moomoom',看看你的意思,但不明白爲什麼bootom代碼失敗。 – WhyWhyWhy

回答

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

+0

爲了擴大這一點,'re.findall'發現不重疊的匹配。 –

+0

我想這正是我所缺少的,從官方文檔:(?='...')匹配如果'...'匹配下一個,但不消耗任何字符串。這被稱爲前瞻斷言。例如,Isaac(?= Asimov)只有跟隨着'Asimov'纔會匹配'Isaac'。我錯過了「不消耗任何字符串」位,對嗎? – WhyWhyWhy

+0

是的,這是正確的。 –