[英]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
開頭a
a
和h
。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*
a
: (?<?\S)al(?!a)\S*
a
和h
:注意單詞以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.