簡體   English   中英

正則表達式前瞻匹配任意數量的字符

[英]Regex Lookahead matching arbitrary number of characters

這類似於正則表達式來匹配包含所有指定字符但不完全匹配的單詞,因為我試圖找到一種更簡潔的方法。 我已經通讀了 Regex Wiki,並且一直在 regex101.com 中進行開發。

我正在編寫一個正則表達式來匹配已知格式的單詞列表中的 5 個字母單詞(沒有特殊字符,所有小寫字母,沒有空格,所有字符都可以與[az]匹配)。 我知道如何使用前瞻來確定一個單詞是否包含一個字母:

import re
re.compile("(?=\S*[a])(?=\S*[h])(?!.*[dieuoftrm])al[^a]..")
            ^^^^^^^^^^ -------------------------------------Word contains an A
                      ^^^^^^^^^^----------------------------Word contains an H
                                ^^^^^^^^^^^^^^^^------------Word does not contain any of  dieuoftrm
                                                

但是,使用這種正向前瞻方法,我必須為我想要包含在單詞中的每個字母添加一個新的前瞻(即,我必須為我想要的每個字母添加另一個(?=\S*[a]) )。

類似於負前瞻,其中所有不需要的字母都包含在一個集合中,有沒有辦法用正前瞻來做到這一點?

我已經嘗試使用 regex101.com 並發現一些不起作用的方法。 我嘗試過的一種方法是使用類似於負前瞻的集合。

給定以下線索,以下表達式試圖匹配alpha

  • 這個詞以al開頭
  • 第三個字母(基於 1 的索引)不是a
  • 該詞同時包含ah
  • 字母dieuoftrm不出現在單詞中的任何位置。
#This one fails due to the lookahead looking for EITHER an a or h in the word. 
>>> re.compile("(?=\S*[ah])(?!.*[dieuoftrm])al[^a]..")

#This one fails due to looking for either `ah` or `ha` in the word. 
#The letters can appear anywhere in the word
>>> re.compile("(?=\S*[ah])(?=\S*[ah])(?!.*[dieuoftrm])al[^a]..")

#This one is what I currently have but it feels messy to use multiple lookaheads
>>> re.compile("(?=\S*[a])(?=\S*[h])(?!.*[dieuoftrm])al[^a]..")

讓我們假設您問題中的“單詞”是一大塊非空白字符(基於您的模式中的\S )。

現在,讓我們定義左側空白邊界: (?<!\S) 我們將僅在這些位置進行匹配。

接下來,讓我們逐步編寫添加需求的模式:

  • 單詞以al開頭: (?<!\S)al\S*
  • 第三個字母(基於 1 的索引)不是a : (?<?\S)al(?!a)\S*
  • 該單詞同時包含ah注意單詞以a開頭,因此我們只需要檢查h ,但讓我們將兩者都放入模式- (?<?\S)(?=\S*?[ah])al(?!a)\S*
  • 字母dieuoftrm不出現在單詞中的任何位置: (?<?\S)(?=\S*?[ah])(??\S*?[dieuoftrm])al(?!a)\S*

請參閱正則表達式演示

如果您處理正則表達式中的單詞(一大堆字母、數字或連接標點符號),請使用\w代替\S\b代替(?<!\S)

如果單詞必須僅包含 5 個字符,請將最后一個\S*替換為\S{2}(?!\S) :兩個非空白字符和右側空白邊界。

暫無
暫無

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

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