2013-01-16 4 views
6

私はたった今Regexで遊んできましたが、ちょっと立ち往生しているようです。私は一括検索を書いて、TextSoapで複数行を使用して置き換えます。 成分と道順 "1"を "1"に変更できないので、 "1 Tbsp"を "1. Tbsp"と書き換えることができます。正規表現を使って番号付きリストを整理する

私はので(おそらく余分な行を持つ)次の2行かどうかを確認するためのチェックが発見として、このコードを使用して次の連番だった

:ごとに交換するよう

^(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 

私の問題は、それが、私はそれを望んでいたように動作しますが、それは...最後の3つの数値のためのタスクを実行することはありませんということです

試験私はクリーンアップするテキストの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 

は後方これを実行するために、前の行または上記の二つをチェックする方法はありますか?私は先読みとlookbehindを見て、私はその時点でやや混乱しています。誰か私の番号付きリストをクリーンアップする方法や、私が望む正規表現で私を助けてくれますか?

+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

HUGEありがとうございます:0)答えと非常によく書かれた説明 - 私はこれらの部品の周りを頻繁に使用/参加するつもりです。乾杯! – Palendrone

+0

これは正規表現のよく書かれた説明ですが、指示と要素を区別する根本的な問題は扱いません。 –

+0

@ dan1111あなたはそうです。私は十分に質問を読んでいなかったし、ちょうど番号付きリストを整理する簡単な方法を投稿した。 Palendrome:私はあなたが正規表現だけで必要なことをすることはできないと思います。私はあなたが慣れていないTextSoapを使っているのを見ています。私はあなたにPythonで必要なことをする方法を示すことができると信じています。それが助けになるなら、私はあなたにもっと良い答えを与えることを試みることができます。しかし、Pythonを気にしなければ気にしません。お知らせ下さい。 – alan

1

これはどうですか?

1 Tbsp salt 
2 Tsp sugar 
3 Eggs 

あなたは正規表現の主要な制限に実行した:あなたのデータは厳密に定義することができないとき、彼らはうまく動作しません。直感的には、成分とステップとは何かを知ることができますが、それをアルゴリズムの信頼できるセットにすることは容易ではありません。

代わりに、ファイル内の位置に基づいたアプローチについて考えることをお勧めします。与えられた料理レシピは通常、すべてのレシピを同じようにフォーマットします。例えば、成分が最初に来て、次にステップのリストが続きます。これはおそらく、違いを伝える簡単な方法でしょう。

+0

私が実行している方法は、手動入力の多くを節約するための自動化されたOCRと自動正規表現のクリーンアップです。特定のレシピが成分の前に来るような方向にレイアウトされていますが、私はこれをします?境界を使用して? – Palendrone

+0

@Palendroneでは、データの内容に依存しますが、空白行やページ番号、タイトルなどのその他のものを探して、ページ上の場所を特定することができます。 –