2017-04-19 47 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> 

遺憾的是,文本可能是在同一行,也可能是多條線路上,甚至有大綱數字和之間的不同數量的空間文本。又如

(1)檢查空氣入口和空氣出口閥被示爲打開如果OAT高於> 53.6華氏度,或閉合如果OAT低於

48.2華氏度

在這種情況下,期望的結果將是

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

我使用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); 

然後我發現我可以指望每個頭標識後的空間和\t,所以後來我就

$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); 

這些措施給了我一些有用的文本字符串運行一些更多的正則表達式,我可以使用。

感謝大家的支持,在我解決這個問題時,給了我一些思考。

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)」與它的文本不在同一行上。呃,髒數據... –