Regex 用于捕获和包装大纲格式文本的正则表达式
我的源文本不是特别干净或格式良好,但我需要找到文本并在标记中换行。文本是大纲格式的Regex 用于捕获和包装大纲格式文本的正则表达式,regex,Regex,我的源文本不是特别干净或格式良好,但我需要找到文本并在标记中换行。文本是大纲格式的 1. becomes a <h1> tag A. becomes a <h2> tag (1) becomes a <h3> tag and so on... 1。成为标签 成为标签 (1) 成为标签 等等 下面是一些源代码的示例 准备测试A。打开门。把灯打开 预期的结果是 <h1>1. PREPARE FOR TEST</h1> <h2>
1. becomes a <h1> tag
A. becomes a <h2> tag
(1) becomes a <h3> tag
and so on...
1。成为标签
成为标签
(1) 成为标签
等等
下面是一些源代码的示例
<h1>1. PREPARE FOR TEST</h1>
<h2>A. Open the door.</h2>
<h2>B. Turn on the light.</h2>
<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) 如果OAT高于53.6华氏度,则检查进气阀和排气阀是否打开;如果OAT低于53.6华氏度,则检查进气阀和排气阀是否关闭
华氏48.2度
在这种情况下,期望的结果是
<h1>1. PREPARE FOR TEST</h1>
<h2>A. Open the door.</h2>
<h2>B. Turn on the light.</h2>
<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)检查皮肤进风口和皮肤出风口阀门是否在温度高于53.6华氏度时打开,或在温度低于48.2华氏度时关闭。
我的问题是
谢谢。因为每个正则表达式都需要不同的替换,所以您需要依次应用每个正则表达式。假设您希望匹配始终跨越整条线,我建议如下:
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)
整个匹配项包含在组0中,可通过\g
在替换字符串中访问该组
“+r”\g“+”#在行周围添加标记
为了以后的参考和结束本文,我最终想到的是先遍历整个文本字符串并删除一些垃圾。实际上,我在这一步中使用了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);
$regexes['step1']=“/(\d{1,2}\..\t)/”;
$regexes['step2']=“/([A-Z]\.\t)/”;
$replacements['step1']=“\n\n$0”;
$replacements['step2']=“\n\n$0”;
preg_replace($this->headerRegexes,$replacements,$string);
这些步骤为我提供了一些可以使用的文本
感谢大家的参与,在我解决这个问题时,它给了我一些思考。您的源文件是否有换行符?不能指望换行符。我们正在将PDF转换为文本,然后尝试解析出来。你说的地方不够清楚:下面是一些源代码的示例。它没有换行符非常复杂是正确的。“所有的词”需要更精确地定义——所有的词直到什么时候?句号?您需要编写一个脚本或多个
regex
,或者可能有多行。我认为源文件中没有这3部分的换行符。也许,我也在等待OP的回答。有时标识符,即“(1)”与随附的文本在不同的行上!。啊,脏数据。。。
$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);