2013-01-16 14 views
6

Sadece Regex ile oynamaya başladım ve biraz sıkışmış gibi görünüyor! Bir yığın buldum ve TextSoap'ta çok satırlı kullanarak değiştirin. OCR'd sahip olduğum tarifleri temizlemek için ve Malzemeler ve Yol Tarifi olduğundan "1 Tbsp" yi "1. Tbsp" olarak yeniden yazabileceğinden "1" olmak için "1" değerini değiştiremiyorum.Düzenli İfade Bir numaralı listeyi temizlemek için

Bu nedenle (muhtemelen ekstra satırlarla) Aşağıdaki iki satır find olarak bu kodu kullanarak bir sonraki sıralı sayılar olup olmadığını görmek için bir onay yaptı:

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

ve her biri için değiştirmek aşağıdaki yukarıda:

$1. $2 $3 $4$5 

My Problem, ben onu istediğim gibi çalışır rağmen, ... son üç numaralar için görevi yerine imkansız olduğunu ifade etmektedir

bir sınav Metnin ple ben temizlemek istiyorum:

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 

Ya ben benziyor istiyorum: geriye bu çalıştırmak için önceki çizgi üstünde veya iki kontrol etmek için bir yoldur

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 

var mı? Lookahead ve lookbehind baktım ve bu noktada biraz kafam karıştı. Numaralandırılmış listemi temizlemek veya istediğim regex ile bana yardımcı olacak bir yöntem var mı?

+2

@Vishal Suthar o düzenleme okuyup düzenlemeden önce soruyu lütfen anla tamamen geçersiz oldu! –

+0

Geriye bir bakış gerekir, ancak normal ifadeler doğası gereği matematik yapmakta kötüdür. Hangi dili kullanıyorsunuz (uygunsa)? – Ryan

cevap

2

dan1111 haklıdır. Benzer görünen verilerle sorun yaşayabilirsiniz. Ama ortaya örnek verilmiş, bu çalışması gerekir:

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

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

Windows kullanmıyorsanız, yerine dizesinden \r s kaldırın.

Açıklama:

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

değiştirin:

$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

BÜYÜK Teşekkürler: 0) Cevap ve çok iyi yazılmış bir açıklama - Bu bölümleri daha sık kullanacağım/katılacağım. Şerefe! – Palendrone

+0

Bu, bir düzenli ifadenin iyi yazılmış bir açıklamasıdır, ancak yönergeler ve içerikler arasında ayrım yapmakla ilgili temel sorunla ilgilenmez. –

+0

@ dan1111 Haklısınız. Soruyu yeterince açık bir şekilde okumadım ve numaralandırılmış bir listeyi temizlemenin daha basit bir yolunu yayınladım. Palendrome: İhtiyacınız olan şeyleri sadece regex ile yapabileceğinizi düşünmüyorum. Biliyorum, aşina olmadığım TextSoap kullanıyorsunuz. Python ile ihtiyacın olanı yapmanın bir yolunu gösterebileceğime inanıyorum. Bu yardımcı olsaydı, sana daha iyi bir cevap vermeyi deneyebilirim. Ama Python'u kullanmayı düşünmüyorsanız rahatsız olmaz. Bilmeme izin ver. – alan

1

Buna ne dersiniz?

1 Tbsp salt 
2 Tsp sugar 
3 Eggs 

Sen regexes önemli bir sınırlama haline çalıştırmak: Verilerinizi kesinlikle tanımlanamaz zaman iyi çalışmaz. İçeriğin ne olduğunu ve adımların ne olduğunu sezgisel olarak öğrenebilirsiniz, ancak bundan bir algoritma için güvenilir bir kural kümesine gitmek kolay değildir.

Bunun yerine dosya içindeki konuma dayalı bir yaklaşım düşünmenizi öneririm. Verilen bir yemek kitabı genellikle tüm tarifleri aynı şekilde biçimlendirir: örneğin, önce içerikler gelir, ardından da adımların listesi gelir. Bu, farkı söylemek için daha kolay bir yol olacaktır.

+0

Çalıştığım yöntem, bir çok manuel girişi kaydetmek için otomatik bir OCR ve otomatik regex temizleme işlemidir, bazı reçetelerin, malzemelerden önce yönergelerin gelebileceği bir şekilde yerleştirildiği bazı durumlar vardır, ancak ben sizin Ben bunu yapıyorum? sınırları kullanarak? – Palendrone

+0

@Palendrone, verilerinizin özelliklerine bağlı olacaktır, ancak boş satırları ve muhtemelen sayfa numaralarını, başlıkları ve sayfada nerede olduğunuzu tanımlamak için diğer biçimlendirme gibi diğer şeyleri arayabilirsiniz. –