2017-04-19 29 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)”与它的文本不在同一行上。呃,脏数据... –