2013-01-16 47 views
6

我剛剛開始玩正則表達式,似乎有點卡住了!我寫了一個批量查找​​並在TextSoap中使用多行替換。這是爲了清理食譜,我有OCR'd,因爲有配料和指示我不能改變「1」成爲「1」,因爲這可以重寫「1湯匙」爲「1湯匙」。正則表達式來清理編號列表

因此,我做了一個檢查,看看下面兩行(可能有額外的行)是使用此代碼爲尋找下一個序列號:

^(1) (.*)\n?((\n))(^2 (.*)\n?(\n)^3 (.*)\n?(\n)) 
^(2) (.*)\n?((\n))(^3 (.*)\n?(\n)^4 (.*)\n?(\n)) 
^(3) (.*)\n?((\n))(^4 (.*)\n?(\n)^5 (.*)\n?(\n)) 
^(4) (.*)\n?((\n))(^5 (.*)\n?(\n)^6 (.*)\n?(\n)) 
^(5) (.*)\n?((\n))(^6 (.*)\n?(\n)^7 (.*)\n?(\n)) 

和替換爲每個以下以上:

$1. $2 $3 $4$5 

我的問題是,雖然它的作品,因爲我想它,它永遠不會執行該任務的最後三個數字...

考試文本的PLE我想清理:

1 This is the first step in the list 

2 Second lot if instructions to run through 
3 Doing more of the recipe instruction 

4 Half way through cooking up a storm 

5 almost finished the recipe 

6 Serve and eat 

而且我希望它看起來像什麼:

1. This is the first step in the list 

2. Second lot if instructions to run through 

3. Doing more of the recipe instruction 

4. Half way through cooking up a storm 

5. almost finished the recipe 

6. Serve and eat 

有沒有一種方法來檢查前行或以上兩個倒着跑的?我看過前方和後方,在這一點上我有些困惑。有沒有人有一種方法來清理我的編號列表或幫助我與我想要的正則表達式?

+2

@Vishal Suthar該編輯完全無效,請仔細閱讀和編輯之前瞭解的問題! –

+0

您需要反向引用,但正則表達式在本質上做數學不好。您使用哪種語言(如果適用)? – Ryan

回答

2

dan1111是對的。您可能會遇到類似數據的麻煩。但考慮到你所提供的樣品,這應該工作:

^(\d+)\s+([^\r\n]+)(?:[\r\n]*) // search 

$1. $2\r\n\r\n     // replace 

如果你不使用Windows,從替換字符串中刪除\r秒。

說明:

^   // beginning of the line 
(\d+)  // capture group 1. one or more digits 
\s+   // any spaces after the digit. don't capture 
([^\r\n]+) // capture group 2. all characters up to any EOL 
(?:[\r\n]*) // consume additional EOL, but do not capture 

替換:

$1.  // group 1 (the digit), then period and a space 
$2  // group 2 
\r\n\r\n // two EOLs, to create a blank line 
      // (remove both \r for Linux) 
+0

巨大謝謝:0)答案和一個很好的書面解釋 - 我將更頻繁地使用/參與這些部分。乾杯! – Palendrone

+0

這是一個正則表達式的正則表達式的解釋,但它並沒有涉及區分指令和成分的基本問題。 – 2013-01-17 08:33:03

+0

@ dan1111你是對的。我沒有清楚地閱讀這個問題,結果只是發佈了一個簡單的清理編號列表的方法。帕累託綜合徵:我認爲你無法單獨用正則表達式來完成你所需要的。我看到你正在使用我不熟悉的TextSoap。我相信我可以向您展示一種通過Python實現您所需的方法。如果這會有所幫助,我可以嘗試給你一個更好的答案。但是如果你不關心使用Python,我不會打擾。讓我知道。 – alan

1

這是怎麼回事?

1 Tbsp salt 
2 Tsp sugar 
3 Eggs 

您遇到了正則表達式的一個主要侷限性:當您的數據無法嚴格定義時,它們無法正常工作。你可以直觀地知道什麼是成分,什麼是步驟,但是從算法的一套可靠的規則中並不容易。

我建議你想想一個基於文件內位置的方法。給定的食譜通常會將所有食譜的格式設置爲相同:例如,配料先來,然後是步驟列表。這可能是一種更簡單的方式來區分差異。

+0

我運行的方法是一個自動化的OCR和自動化的正則表達式清理工具,可以節省大量的手動輸入,還有一些情況下某些食譜是以某種方式進行佈局的,這些方式可能會在食材前發出指示,但我會採納您的觀點,我這樣做?使用邊界? – Palendrone

+0

@Palendrone,這取決於您的數據的具體情況,但您可以查找空白行,以及可能的其他內容,如頁碼,標題和其他格式以確定您在頁面上的位置。 – 2013-01-16 14:05:27