Php 正则表达式是否删除所有双空格,除了\n?预更换

Php 正则表达式是否删除所有双空格,除了\n?预更换,php,html,regex,preg-replace,Php,Html,Regex,Preg Replace,我已经使用Python脚本导入了一个纯文本版本的PDF,但是它有一堆我不关心的垃圾工件 我唯一关心的空白是(1)单个空格,以及(2)双\n的空格 单词边界之间的单个空格,原因显而易见双\n,在段落之间划界 它包含的垃圾空格如下所示: [\ \n\t]+ all jumbled together 这就引出了另一个问题,有时段落是由 [\n][\s]+[\n] 我对正则表达式没有足够的经验,无法使它忽略两个\n之间的内部空白。作为一名业余RegExer,我的问题是\s包括\n 如果没有,我想这是

我已经使用Python脚本导入了一个纯文本版本的PDF,但是它有一堆我不关心的垃圾工件

我唯一关心的空白是(1)单个空格,以及(2)\n的空格

单词边界之间的单个空格,原因显而易见双\n,在段落之间划界

它包含的垃圾空格如下所示:

[\ \n\t]+ all jumbled together
这就引出了另一个问题,有时段落是由

[\n][\s]+[\n]
我对正则表达式没有足够的经验,无法使它忽略两个
\n
之间的内部空白。作为一名业余RegExer,我的问题是
\s
包括
\n

如果没有,我想这是一个很容易解决的问题

所有其他空白都是无关紧要的,我所尝试的任何东西都无法真正发挥作用

如有任何建议,将不胜感激

示例文本

这只是让我找到更多的解决方法。。。必须删除所有页码和随机双\n。

您可以使用断言来排除换行符:

 ((?!\n)\s){2,}

要将换行符与中间的
\n\s+\n
空格合并,可以使用类似的构造来代替
\s+
。但为了简单起见,我只需使用两个
preg\u match
es,首先合并换行符,然后清除两个空格。

您可以使用断言使
\s
排除换行符:

 ((?!\n)\s){2,}

要将换行符与中间的
\n\s+\n
空格合并,可以使用类似的构造来代替
\s+
。但为了简单起见,我只需要使用两个
preg_match
es,首先合并换行符,然后清理两个空格。

我认为这会起作用:

  • 将“\s*\n\s*\n\s*”替换为“\n\n”

    这将使段落分隔符标准化

  • 将“\s*\s*”替换为“”

    这将使单词分隔符标准化


  • 我认为这会奏效:

  • 将“\s*\n\s*\n\s*”替换为“\n\n”

    这将使段落分隔符标准化

  • 将“\s*\s*”替换为“”

    这将使单词分隔符标准化

  • 上面将删除水平空白(我假设您不担心垂直制表符或回车符)和双空格上的所有换行符


    上面的内容将删除水平空格(我假设您不担心垂直制表符或回车符)和双空格上的所有换行符。

    尽管有点粗糙,但我认为这应该可以做到:

    preg_replace('/\t |(){2,}|(\n)\s+(\n)/','\1\2\3',$data)


    奖励:不需要在琴弦上做两次传球。

    稍微有点不自然,但我认为这应该可以做到:

    preg_replace('/\t |(){2,}|(\n)\s+(\n)/','\1\2\3',$data)



    奖励:不需要对字符串进行两次传递。

    我从未听说过这个断言,我现在在谷歌上搜索它以获得更多解释!抱歉,忘了链接:有一个可理解的关于前瞻性和背后断言的介绍,以及?!负变量。这就是我使用
    $find[5]='/[\s]*((?!\n)\s){2,}[\s]*/'得到的结果$固定[5]='

    '
    @mario如何做到这一点,但要保护
    标记中的空格?@Lea:事先将这些区域分开。我从未听说过这一断言,我现在在谷歌上搜索它以获得更多解释!抱歉,忘了链接:有一个可理解的关于前瞻性和背后断言的介绍,以及?!负变量。这就是我使用
    $find[5]='/[\s]*((?!\n)\s){2,}[\s]*/'得到的结果$固定[5]='

    '
    @mario除了保护
    标记中的空格外,如何做到这一点?@Lea:事先将这些区域分开。\1\2\3只是替换字符串正确部分的一个技巧。你能上传一些测试数据吗?如果不能正确地尝试,就很难正确地使用它。。。这是一个巨大的文件。。。所以我将只发布一点itI,我认为堆栈溢出也在清理文件,当我发布它时。哈哈\1\2\3只是替换字符串右侧部分的一个技巧。你能上传一些测试数据吗?如果不能正确地尝试,就很难正确地使用它。。。这是一个巨大的文件。。。所以我将只发布一点itI,我认为堆栈溢出也在清理文件,当我发布它时。哈哈,看看你问了多少正则表达式问题。如果你开始认真学习它们,你认为你(和我们)的时间值得吗?如果你仔细阅读OReilly Regex这本书并不难。谢谢你的评论,Mike。我很高兴正则表达式对你来说很简单。迈克的评论是对的。如果你不得不问那么多问题,也许你应该研究这个问题,而不是继续要求别人为你做事。我自己也喜欢Regex食谱。看看你问的Regex问题的数量。如果你开始认真学习它们,你认为你(和我们)的时间值得吗?如果你仔细阅读OReilly Regex这本书并不难。谢谢你的评论,Mike。我很高兴正则表达式对你来说很简单。迈克的评论是对的。如果你不得不问那么多问题,也许你应该研究这个问题,而不是继续要求别人为你做事。我自己也喜欢Regex的食谱。
    s/(\h)+/$1/g;
    s/\n(\s*\n)+/\n\n/g;