2011-09-12 60 views
3

我有一個正則表達式模式,我使用了大量的文本(單個字符串)。原始文本的幾個不連續區域與正則表達式匹配。現在,我試圖構建一個狀態機,遍歷文本並根據某個位置上的char做不同的事情,以及這個位置是否在正則表達式匹配的範圍內。Python的正則表達式:如何檢查字符串中的字符是否在正則表達式匹配的子字符串的跨度內?

使用RE.finditer(文本),我可以找到所有子字符串,並提取它們的跨度,因此我有一個元組列表來處理例如

(1,5) (10,15) (20,55), 等

利用該信息,在給定的我的字符串的字符的索引,我可以寫一個算法來看如果該字符是正則表達式字符串的一部分。例如,給定字符6,我可以通過跨度列表並確定它不是匹配子字符串的一部分。

有沒有更好的方法來做到這一點?

由於提前,

JW

+0

這聽起來像你想寫一個解析器FSM(其中包括其他東西)tokenizes com馬字符,只有當他們沒有逃脫。你真的想編寫自己的狀態機,而不僅僅是語法,並讓* antlr/lex *爲你創建FSM嗎? – smci

+0

葉有點,我的lex/yacc有點模糊:)。 – wk1989

+0

當你需要的是一個正則表達式,它匹配標識符內的轉義逗號時,無需編寫解析器FSM。那麼現在你想把所有*'bbbb /,ccccc' *作爲一個標記還是三個? – smci

回答

1

編輯:這聽起來像你想編寫自己的解析器FSM其中(除其他事項外)逗號標記化的人物,只有當他們沒有逃脫。 以下正則表達式適用於標識符,可能包含轉義逗號。你可以使用ANTLR /法使用:

input = r'aaaaa,bbbb/,ccccc,dddddd,' 

pat = re.compile(r'((\w+|/,)+)') 

for mat in re.finditer(pat, input): 
    ... do stuff with mat.group(0) 

(原來的答覆: 這可能是一個很好的解決方案,但你沒有給我們足夠的上下文來告訴

性格是否發生。一次或多次?如果發生一次,您可以檢查string.find(char)的索引是否在正則表達式匹配的範圍內

字符是否有任意字符 - 給我們一個具體的例子嗎? 爲什麼是y你在每個字符的基礎上做這個?據推測,你不是順序檢查多個字符?

是你想要的結果布爾值('是的,字符被發現在一些正則表達式匹配的範圍')?以及你在做一個正則表達式匹配的情況下做了什麼?

+0

我有一個狀態機遍歷字符串,並根據字符是什麼執行特定的操作,並且該字符是否是正則表達式匹配的一部分。例如,如果字符是「,」而不是正則表達式匹配子字符串的一部分(所以我想忽略所有的',',如果它在由特定正則表達式匹配的子字符串內)。所以我將處理同一個字符的多個實例,並且需要知道它們中的每一個是否是正則表達式匹配子字符串的一部分。希望這個清除它,謝謝。 – wk1989

+0

仍然沒有足夠的上下文。 **請發佈一個具體的字符串輸入和輸出示例。**爲什麼你要寫一個通用的狀態機 - 是你的目標還是你選擇的實現? **爲什麼**你是否試圖將逗號字符與正則表達式匹配進行匹配 - 要解決的具體問題是什麼? – smci

+0

如果你只想忽略你的匹配中的一系列ignoreChars,那麼一定要對它們應用'string.translate(... deleteChars)'? – smci

1

編輯 這裏是一個正則表達式,這將搶,之間的文本忽略逃脫,

(?=<,)(?:[^,]|(?=</),)(?=,) 

原來的答案 下面是一些僞Python代碼是應該做你要找的內容:

pattern = re.compile(...) 
pos = 0 

while (match = pattern.search(haystack, pos)) { 
    for (i in range(pos, match.start) 
    //These chars are outside the match. 

    for (i in group(0)) 
    //The chars are in the match 

    pos = match.end 

//Finish with the rest of the chars not matched 
for (i in range(pos, len(haystack)) 
    //These chars are outside the match. 
+1

'haystack'?這是soooo PHP – NullUserException