2013-01-16 12 views
6

Dopiero zacząłem grać z Regeksem i wydaje mi się, że trochę utknąłem! Napisałem masę znajdującą i zastępującą za pomocą multilinii w TextSoap. To jest do czyszczenia receptur, które mam OCR i ponieważ istnieje Składniki i kierunki Nie mogę zmienić "1", aby stać się "1.", ponieważ może to przepisać "1 łyżka" jako "1. Tbsp".Wyrażenia regularne w celu wyczyszczenia ponumerowanej listy

więc zrobiłem test, by sprawdzić, czy następujące dwie linie (ewentualnie z dodatkowych rzędów) był kolejnym numery sekwencyjne wykorzystujące ten kod jako obejrzeć:

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

i następujący jak zastąpić dla każdego powyżej:

$1. $2 $3 $4$5 

Moim problemem jest to, że chociaż to działa jak chciałem go, to nigdy nie wykonać zadanie w ciągu ostatnich trzech liczb ...

egzamin ple tekstu Chcę oczyścić:

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 

I co chcę wyglądać:

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 

Czy istnieje sposób, aby sprawdzić poprzedni wiersz lub dwa powyżej, aby uruchomić ten w tył? Spojrzałem na wcześniejszą stronę i wyglądałem, a ja jestem nieco zdezorientowany w tym momencie. Czy ktoś ma metodę czyszczenia mojej listy numerowanej lub pomóc mi z żądaniem regex, proszę?

+2

@Vishal Suthar że edycja była całkowicie nieważny należy przeczytać i zrozumieć pytanie zanim edycji! –

+0

Będziesz potrzebował referencji zwrotnej, ale wyrazy regularne są złe w wykonywaniu matematyki z natury. Który język używasz (jeśli dotyczy)? – Ryan

Odpowiedz

2

dan1111 ma rację. Możesz napotkać kłopoty z podobnymi wyglądającymi danymi. Ale biorąc pod uwagę próbka podałeś, to powinno działać:

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

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

Jeśli nie używasz systemu Windows, usuń \r s z ciągiem zastąpić.

Objaśnienie:

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

Wymienić:

$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

OGROMNE Dziękuję: 0) Odpowiedź i bardzo dobrze napisane wyjaśnienie - będę częściej używać/uczestniczyć w tych częściach. Twoje zdrowie! – Palendrone

+0

Jest to dobrze napisane wyjaśnienie regexu, ale nie zajmuje się podstawową kwestią rozróżniania instrukcji od składników. –

+0

@ dan1111 Masz rację. Nie przeczytałem tego pytania wystarczająco jasno, a skończyło się na tym, że napisałem prostszy sposób czyszczenia listy numerowanej. Palendrome: Nie sądzę, że możesz zrobić to, czego potrzebujesz z samym regex. Widzę, że używasz aplikacji TextSoap, której nie znam. Wierzę, że mogę pokazać ci sposób na zrobienie tego, czego potrzebujesz w Pythonie. Jeśli to pomogłoby, mógłbym spróbować dać ci lepszą odpowiedź. Ale nie będę się tym przejmował, jeśli nie będziesz chciał używać Pythona. Daj mi znać. – alan

1

Co z tym?

1 Tbsp salt 
2 Tsp sugar 
3 Eggs 

Masz napotkasz dużego ograniczenia regexes: nie działają dobrze, gdy dane nie mogą być ściśle określone. Możesz intuicyjnie wiedzieć, jakie są składniki i jakie kroki, ale nie jest łatwo przejść od tego do niezawodnego zestawu reguł dla algorytmu.

Proponuję zamiast myśleć o podejściu, które jest oparte na pozycji w pliku. Dana książka kucharska zwykle formułuje wszystkie przepisy tak samo: na przykład, składniki pojawiają się jako pierwsze, a następnie listę kroków. Byłby to prawdopodobnie łatwiejszy sposób odróżnienia.

+0

Sposób, w którym pracuję, to zautomatyzowane OCR i automatyczne oczyszczanie regex, aby zaoszczędzić wiele ręcznych danych wejściowych, są pewne przypadki, w których niektóre przepisy są określone w taki sposób, że wskazówki mogą pochodzić sprzed składników, ale rozumiem, jak Robię to? używając granic? – Palendrone

+0

@Palendrone, zależałoby to od specyfiki twoich danych, ale możesz szukać pustych linii i ewentualnie innych rzeczy, takich jak numery stron, tytuły i inne formatowanie, aby określić, gdzie jesteś na stronie. –

Powiązane problemy