2017-07-17 58 views
0

如何實現的Lua frontier pattern如何在Python中實現Lua邊界模式?

%f[set]一個空字符串在任何位置,使得下一個字符屬於集合和前面的字符不屬於設置

在Python正則表達式匹配

+2

請問您能詳細解釋一下嗎?我對Lua並不十分熟悉,不能提供沒有更多信息的等效Python正則表達式。它也可能幫助我們理解你想要什麼,如果你創建了你的問題的[mcve]並展示你的嘗試。 –

+2

你有特定的字符串,你試圖匹配?正如我上面所說,你能提供一個[mcve]嗎? –

+0

Hi @ChristianDean我已經添加了一個鏈接到Lua wiki,它解釋了一些情況。我想找到一個統一的替代方案,而不是某種情況下的解決方案。 – abuccts

回答

0

您可能正在尋找正常表達式中的「向前」模式。例如:

import re 

s = 'there is 1more 2go 3fold' 
#  
pat = re.compile('(?=[12])') 
for m in pat.finditer(s): 
    print(m.start()) 

產量:

9 
15 

the docs

(?= ...)如果匹配...接下來比賽,但不消耗任何字符串。 這被稱爲超前斷言(lookahead assertion)。例如,Isaac(?= Asimov)只有跟着'Asimov'纔會匹配 'Isaac'。

Contra其中一個註釋,超前表達式並不限於'固定長度字符串',至少在我理解該描述的範圍內。例如:

s = 'there is 1Fmore 1Gother 21go 3fold 3slambam' 

pat = re.compile('(?=(1F|2|3sl.[mn]))') 
for m in pat.finditer(s): 
    print(m.start(), repr(s[m.start():])) 

收率:

9 '1Fmore 1Gother 21go 3fold 3slambam' 
24 '21go 3fold 3slambam' 
35 '3slambam' 

這裏先行是用於改變長度的一個相當廣闊的子圖案,並與嵌入的通配符和它自己的子表達式。

+0

在Python中,'(?= ...)'只支持固定長度的字符串,而邊界模式可以使用一個完整的模式,不能輕易轉換。 – abuccts

+0

我不明白批評。增加了更新後的可變長度模式示例作爲前瞻。如果您提供了一個更具體的例子,您將嘗試匹配,我會嘗試翻譯。就我所能看到的你提供的Lua例子而言,lookahead是一個非常接近前沿模式的類比。 –

+0

@JonathanEunice邊界模式在Lua中既是向前看又是向後看。 –