正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词

Posted

技术标签:

【中文标题】正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词【英文标题】:Regex - find all whitespaces and ignore hyphen separated words in multiline string 【发布时间】:2020-03-03 13:12:44 【问题描述】:

我想创建一个查找空格并忽略连字符分隔的单词的正则表达式模式。

基本规则是查找任何后续空格([\s]+),并且查找模式所在的空格:

[\S]+-[\s]+[\S]+(我不想匹配空格的模式)

任何其他空格都应该匹配。

匹配的间隔应该只包含空格,而不是其他字符。

例如:

abc abc

应该在位置 3-4 匹配。

abc 定义

应该从 abc 的结尾匹配到 def 的开头。

abc-

定义

不应该匹配。

abc-

定义

应该在 3-4、5-6 匹配。

搜索的字符串是多行的,有很多空格,我想在一次搜索中找到它们。

尝试了许多不同的模式(负前瞻和后瞻),但没有一个能够适用于所有情况。

使用python内置re模块。

可以进行两次搜索:

    搜索所有出现的[\s]+

    搜索所有出现的[\S]+-([\s]+)[\S]+

    从 (1) 中的匹配项中删除 (2) 中组的匹配项

可以一次搜索吗?

【问题讨论】:

试试r'(?<=[^\s-])\s+(?=\S)|(?<=\S)\s+(?=[^\s-])'r'(?<=[^\s-])\s+(?=[^\s-])' 也许是这样,但仍然无法正常工作。 regex101.com/r/qSZq9P/7 见这个例子。这应该不匹配,类似于问题中的示例 3 见regex101.com/r/qSZq9P/9, r'(?<=[^\s-])\s+(?=[^\s-])' 这解决了上面的问题,现在像这样的字符串:“dsa - dsa”应该在空格中匹配两次,而不是在当前模式中。如示例(4)。 也许(?<!-)\s+|(?<=\s-)\s+ regex101.com/r/RqNmpx/1 【参考方案1】:

这个怎么样:

(?<![\s\-])[\s](?!\-\s\n)
    (?&lt;![\s\-]) 不看一个接一个的空格和 - :(消极看后面) (?!\-\s\n) 之前不看空格 - 空格和换行:(负向前看)

已编辑:

试试这个:

(?<![\s])[\s+](?!\-\s\n)(?!\n2)

查看您的示例数据后,其中一些包含双换行符:

    (?&lt;![\s])不看空间 (?!\-\s\n) 不看破折号、空格和换行符之前 (?!\n2) 不看双换行符

【讨论】:

不适用于:“abc - abc”。应该产生两个匹配。一个在“-”之前,一个在之后。 编辑后 - "abc\n\ndef" 失败。它应该匹配任何空格,除了问题中指定的那些。 毕竟我认为它只能通过多步正则表达式来完成,因为您的数据在接受的空间之间具有略微相同的条件。让我们等待可能有人有另一种解决方案。

以上是关于正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词的主要内容,如果未能解决你的问题,请参考以下文章

关于正则表达式

05正则表达式

如何忽略正则表达式主题字符串中的空格?

忽略正则表达式中的空格并匹配

正则表达式中/i,/g,/m的作用

PHP正则表达式基本函数