2017-04-19 8 views
1

私は、特にクリーンでないか整形式ではないソーステキストを持っていますが、テキストを見つけてタグに行をラップする必要があります。テキストはアウトライン形式です。正規表現の書式付きテキストをキャプチャして折り返す正規表現

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

ソースの例を次に示します。

  1. テスト準備A.ドアを開けます。 B.ライトを点灯する。

望ましい結果は

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

残念ながら、テキストが同じ行であってもよいであろうか、複数行にすること、あるいは輪郭数との間の空間の異なる数を有することができますテキスト。別の例OATが上記である場合

(1)空気入口及び空気出口弁をチェックが開示されて> 53.6゜F、または閉じOATは

48.2℃未満である場合F.

この場合、所望の結果が

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

私の質問はあるだろう

  1. アウトラインレベルに関連付けられたテキスト行全体、つまり1.、A.、(1)などを見つけるにはどうすればよいですか。
  2. どのように適切なタグでそのテキストを折り返しますか?

私は正規表現で特に強くはありませんが、私はこのプロジェクトで必要とされるよりシンプルなものをいくつか行うことができました。ここで私はH1の行を見つけようとしましたが、正規表現を知っている人は誰でも明示的に見ることができますが、これは最初の単語を過ぎても機能しません。 D {1,3} \

。\ S + [AZ] {2}

Iは、現時点でのPythonを使用しているが、PHPとのより良いです、必要に応じてそれを移動することができると私はPHPとPythonの方が優れているからです。

ありがとうございます。

+0

ソースファイルに改行がありますか? –

+0

改行を数えることはできません。私たちはPDFをテキストに変換して解析しています。 –

+0

**完全にはっきりしない**あなたが言ったところ:*ここにソースの例があります*改行がありません –

答えて

0

今後の参考にして、これを閉じるには、最終的にはテキスト全体を実行して、ごみを取り除く必要がありました。これらのうち実際にこのステップで使用するのは15個あります。

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

私はその後

は、これらの手順は、私に、私、いくつかの使用可能なテキストを与えている
$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); 

ので、私は、文字列の上にいくつかのより多くの正規表現を実行し、私はそれぞれのヘッダ識別子の後にスペースと\tに数えることができることを発見一緒に働くことができます。

私はこの問題に取り組んでいると思っていました。

1

すべての正規表現は異なる置換が必要なので、各正規表現を順番に適用する必要があります。(

正規表現の各:

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) 

結果:

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

説明あなたは試合は常に行全体にまたがるしたいと仮定すると、私はこのようなものをお勧めしたいです実際の識別子にのみ一致する)は、行の先頭から行の終わりまで一致するように変更されます。

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

マッチ全体がグループ0に含まれ、置換文字列で\g<0>でアクセスできます。

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

私はソースファイルにこれらの3つの部分の改行がないと思うでしょう –

+0

多分、私はOPの答えも待っています。 –

+0

また、識別子(「(1)」はそれに付随するテキストとは異なる行にあることがあります)。ああ、汚いデータ... –