Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于捕获和包装大纲格式文本的正则表达式_Regex - Fatal编程技术网

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) 成为标签
等等
下面是一些源代码的示例

  • 准备测试A。打开门。把灯打开
  • 预期的结果是

    <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华氏度时关闭。
    
    我的问题是

  • 如何找到与大纲级别相关联的整行文本,即1、、等等
  • 然后如何使用适当的标记包装该文本
  • 我在正则表达式方面不是特别强,我已经能够完成这个项目所需的一些简单的事情,但这让我有点难堪。这里是我过去试图找到H1行的内容,但是任何了解regex的人都可以清楚地看到,这在第一个单词之后就不起作用了

    \d{1,3}.\s+[A-Z]{2,}

    目前我正在使用Python,但对PHP比较在行,如果需要的话,我还可以继续使用,因为我在PHP方面比Python更在行


    谢谢。

    因为每个正则表达式都需要不同的替换,所以您需要依次应用每个正则表达式。假设您希望匹配始终跨越整条线,我建议如下:

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