2012-01-10 188 views
0

我想用正則表達式來解析下面的語句:匹配列表與正則表達式

(o) Multi 
line 
text 
(o) Single line text 
(o) Single line text 

當我使用下面的正則表達式,源的全部文本被捕獲:

(?<bullet>\(o\)\) (?<text>.+) 

我想要實現的是有text組的三個匹配,即。

Multi 
line 
text 

然後兩次Single line text

如果解決方案是前瞻/後面,如何使用它來實現這一目標?

謝謝。

回答

2

您可以使用先行檢查下一個(O)或輸入

(?<bullet>\(o\)) (?<text>.*?)(?=\(o\)|$)

+0

工程就像一個魅力。但星號後的問號是什麼意思? – grizzly 2012-01-10 22:16:44

+1

這意味着它的懶惰或不合理,基本上它說它會採取最少量的文本匹配。你可以在這裏閱讀http://www.regular-expressions.info/repeat.html – 2012-01-11 07:37:34

0

只需在正則表達式的末尾添加(o)或EOF,以便在下一個項目符號或文件末尾處切斷。我不知道你使用哪種類型的正則表達式來給你確切的正則表達式,但是想法是匹配的。

這是如何在正常的正則表達式匹配EOF: regex to match EOF

0

的到底是爲什麼使用正則表達式在所有?看起來像你有兩種情況 - 一行以子彈開頭或不行。如果以子彈開頭,請將其關閉,然後用剩餘的行開始新的文本對象。如果它不以子彈開頭,請將該文本追加到前一個文本對象。僞代碼:

text = [] 
i = -1 
for line in data: 
    if line.starts_with('(o)'): 
     i += 1 
     text[i] = line[2:] # all characters in the line after the first three 
    else: 
     text[i].append(line) 
+0

謝謝,這將工作,但我特別需要使用正則表達式。 – grizzly 2012-01-10 22:28:14

+0

不幸的。我認爲正則表達式是一種只寫語言,因此儘量保留最簡單的正則表達式作爲最後手段。請至少在正則表達式中提出一些明確的評論,所以當你在六個月內回來時,你不需要解碼它。 – 2012-01-11 17:07:14