簡體   English   中英

"正則表達式 (Python) - 匹配具有兩個或多個不同元音的單詞"

[英]Regex (Python) - Match words with two or more distinct vowels

我正在嘗試匹配包含兩個或多個不同元音的字符串中的單詞。 問題可以限制為小寫。

string = 'pool pound polio papa pick pair'

預期結果:

pound, polio, pair

poolpapa會失敗,因為它們只包含一個不同的元音。 但是, polio很好,因為即使它包含兩個o ,它也包含兩個不同的元音( io )。 mississippi會失敗,但albuquerque會通過)。

思考過程:使用環視,可能五次(忽略大寫),用括號括起來,然后是{2} 就像是:

re.findall(r'\w*((?=a{1})|(?=e{1})|(?=i{1})|(?=o{1})|(?=u{1})){2}\w*', string)

但是,這匹配所有六個單詞。

我殺死了{1} ,這使它更漂亮( {1}似乎沒有必要),但它仍然返回所有六個:

re.findall(r'\w*((?=a)|(?=e)|(?=i)|(?=o)|(?=u))\w*', string)

提前感謝您的任何幫助。 我檢查了其他查詢,包括“如何查找帶有兩個元音的單詞” ,但似乎沒有一個足夠接近。 另外,我正在尋找純正則表達式。

你不需要5個單獨的前瞻,這是完全矯枉過正的。 只需捕獲捕獲組中的第一個元音,然后使用否定前瞻聲明它與第二個元音不同:

[a-z]*([aeiou])[a-z]*(?!\1)[aeiou][a-z]*

請參閱在線演示。

你的\\w*((?=a)|(?=e)|(?=i)|(?=o)|(?=u))\\w* regex匹配所有至少有1個元音的單詞。 \\w*匹配0+單詞字符,因此第一個模式抓取整個字母,數字和下划線。 然后,回溯開始,正則表達式引擎試圖找到一個跟隨aeiou 一旦找到該位置,之前抓取的單詞字符將再次被抓取並使用尾隨\\w*消耗。

要將整個單詞與至少2個不同的元音相匹配,您可以使用

\b(?=\w*([aeiou])\w*(?!\1)[aeiou])\w+

請參閱正則表達式演示

細節

  • \\b - 單詞邊界
  • (?=\\w*([aeiou])\\w*(?!\\1)[aeiou]) - 一個正向前瞻 ,緊靠當前位置的左側,需要
    • \\w* - 0+單詞字符
    • ([aeiou]) - 捕獲組 1(其值在模式中稍后用\\1 反向引用 ):任何元音
    • \\w* - 0+單詞字符
    • (?!\\1)[aeiou] - 來自[aeiou]集合的任何元音不等於存儲在第1組中的元音(由於負向前瞻(?!\\1) ,如果,則立即返回到在當前位置右側,找到前瞻模式匹配)
  • \\w+ - 1個或更多單詞字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM