2017-04-19 2 views
1

Ich habe Quelltext, der nicht besonders sauber oder gut geformt ist, aber ich muss Text finden und eine Zeile in ein Tag umbrechen. Der Text ist im Gliederungsformat.Regex zum Erfassen und Umbrechen von Umriss formatiertem Text

1. becomes a <h1> tag 
A. becomes a <h2> tag 
(1) becomes a <h3> tag 
and so on... 

Hier sind einige Beispiele für die Quelle.

  1. FÜR TEST A. Bereiten Sie die Tür öffnen. B. Schalten Sie das Licht ein.

würde das gewünschte Ergebnis

<h1>1. PREPARE FOR TEST</h1> 
<h2>A. Open the door.</h2> 
<h2>B. Turn on the light.</h2> 

Leider ist der Text die gleiche Linie sein könnte oder es könnte auf mehreren Zeilen oder sogar eine unterschiedliche Anzahl von Räumen zwischen der Gliederungsnummer hat und die Text. Ein weiteres Beispiel

(1) Überprüfen Lufteinlaß und Luftauslaß Ventile geöffnet werden angezeigt, wenn OAT oben ist> 53,6 Grad F., oder geschlossen, wenn OAT unter

48,2 Grad F.

In diesem Fall wird das gewünschte Ergebnis würde

<h3>(1) Check skin air inlet and skin air outlet valves are shown open if temperature is above 53.6 deg F., or closed if temperature is below 48.2 deg F.</h3> 

Meine Fragen sind sein

  1. Wie finde ich eine ganze Textzeile, die mit einer Gliederungsstufe verknüpft ist, d. H. 1., A., (1) und so weiter.
  2. Wie wickle ich dann diesen Text mit dem entsprechenden Tag.

Ich bin nicht besonders stark bei Regex, ich war in der Lage, einige der einfacheren Dinge dieses Projekts zu tun, aber das hat mich ein wenig ratlos. Hier ist, was ich versucht habe, um die H1-Zeilen zu finden, aber wie jeder, der Regex kennt, sehen kann, wird dies nicht nach dem ersten Wort funktionieren.

\ d {1,3}. \ S + [AZ] {2,}

Ich verwende Python im Moment, aber ich besser mit PHP und kann, dass bei Bedarf beweglich und kann immer noch, weil ich bei PHP besser bin als Python.

Vielen Dank.

+0

Hat Ihre Quelldatei newline oder nicht? –

+0

Kann nicht auf einen Zeilenumbruch zählen. Wir konvertieren PDFs in Text und versuchen dann, es auszuwerten. –

+0

** Nicht klar genug ** Wo Sie gesagt haben: * Hier sind einige Beispiele für die Quelle. * Es hat keine neue Zeile –

Antwort

0

Für zukünftige Referenz und um dieses zu schließen, was ich schließlich kam, war, durch die gesamte Textzeile zu laufen und etwas Abfall zuerst zu entfernen. Es gibt tatsächlich 15 davon, die ich für diesen Schritt verwende.

$regexes['lf'] = "/[\n\r]*/"; 
$regexes['tab-cr-lf'] = "/\t[\r\n]/"; 
preg_replace($regexes,"", $string); 

entdecken ich dann, dass ich auf Platz und \t nach jeder Kopfkennung zählen konnte, so ist, dann laufe ich ein paar mehr regulären Ausdrücke auf der Saite

$regexes['step1'] = "/(\d{1,2}\..\t)/"; 
$regexes['step2'] = "/([A-Z]\. \t)/"; 
$replacements['step1'] = "\n\n<step1>$0"; 
$replacements['step2'] = "\n\n<step2>$0"; 
preg_replace($this->headerRegexes, $replacements, $string); 

haben diese Schritte mir einig brauchbaren Text gegeben, dass ich kann damit arbeiten.

Vielen Dank an alle, die sich gemeldet haben, es gab mir etwas zum Nachdenken, als ich dieses Problem in Angriff nahm.

1

Da jeder Regex eine andere Ersetzung benötigt, müssen Sie jeden Regex der Reihe nach anwenden.Unter der Annahme, dass Sie das Spiel wollen eine gesamte Linie, immer überspannt, würde ich so etwas wie dies vorschlägt:

import re 
s = """1. becomes a h1 tag 
A. becomes a h2 tag 
(1) becomes a h3 tag 
and so on...""" 

regexes = {r"\d+\.": "h1", 
      r"[A-Z]+\.": "h2", 
      r"\(\d+\)": "h3", 
      } 

for regex in regexes: 
    repl = regexes[regex] 
    s = re.sub("(?m)^" + regex + ".*", "<" + repl + ">" + r"\g<0>" + "</" + repl + ">", s) 

print(s) 

Ergebnis:

<h1>1. becomes a h1 tag</h1> 
<h2>A. becomes a h2 tag</h2> 
<h3>(1) becomes a h3 tag</h3> 
and so on... 

Erläuterung:

Jedem des regulären Ausdrücke (die nur mit den tatsächlichen Bezeichnern übereinstimmen) wird so geändert, dass sie vom Zeilenanfang bis zum Ende der Zeile passt:

"(?m)^" + regex + ".*" # (?m) allows^to match at the start of lines 

Die gesamte Übereinstimmung ist in Gruppe 0 enthalten, auf die im Ersetzungsstring über \g<0> zugegriffen werden kann.

"<" + repl + ">" + r"\g<0>" + "</" + repl + ">" # add tags around line 
+0

Ich denke, die Quelldatei haben keine neue Zeile für diese 3 Teil –

+0

Vielleicht warte ich auch auf OP Antwort. –

+0

Und manchmal ist die Kennung, d.h. "(1)", in einer anderen Zeile als der Text, der dazu gehört !. Argh, schmutzige Daten ... –

Verwandte Themen