正则表达式:匹配空格之间的单词

Posted

技术标签:

【中文标题】正则表达式:匹配空格之间的单词【英文标题】:Regular expression: matching words between white space 【发布时间】:2017-12-24 16:11:48 【问题描述】:

我正在尝试用 python 中的正则表达式做一些相当简单的事情……至少我是这么认为的。

我想要做的是匹配一个字符串中的单词,如果它的前面和后面都有一个空格。如果它在字符串的开头,则之前不需要空格 - 如果它在结尾,也不要搜索空格。

例子:

"WordA WordB WordC-WordD WordE"

我想匹配WordA WordB WordE

我只是想出了这样做的过于复杂的方法......

(?<=(?<=^)|(?<=\s))\w+(?=(?=\s)|(?=$))

在我看来,这样一个简单的问题必须有一个简单的方法...... 我想我可以从 (?&lt;=\s|^) 开始,但这似乎不可能,因为“后视需要固定宽度的模式”。

【问题讨论】:

【参考方案1】:

您似乎在 Python 中工作,因为 (?&lt;=^|\s) 在 PCRE、Java 和 Ruby 中完全有效(并且 .NET 正则表达式支持无限宽度的后向模式)。

使用

(?<!\S)\w+(?!\S)

它将匹配 1 个或多个用空格或字符串开头/结尾括起来的单词字符。

请参阅regex demo。

模式详情

(?&lt;!\S) - 一旦引擎在当前位置的左侧找到一个非空白字符,就会导致匹配失败 \w+ - 1 个或多个单词字符 (?!\S) - 一旦引擎在当前位置右侧找到一个非空白字符,就会导致匹配失败。

【讨论】:

有道理!谢谢。我想搜索非空白而不是空白要容易得多。 不确定它更容易,但更有效。 我不明白为什么简单的 \s+ 包围我们需要的东西不起作用 @BFurtado 因为\s 占用了一个空格。看this demo:只有一个匹配,因为两端的\s需要左右有一个空格。 WordAWordE 一端没有空格。你可能认为(\s|^)\w+(\s|$) 会起作用,但it does not match consecutive occurrences 因为(\s|$) 占用了WordA 之后的空格,因此(\s|^) 找不到WordB 匹配项。 @BFurtado 我会尝试在我的 Youtube 频道中解释它并与您分享一个链接(频道链接在我的个人资料中)。

以上是关于正则表达式:匹配空格之间的单词的主要内容,如果未能解决你的问题,请参考以下文章

需要正则表达式来匹配两个单词,因为它们之间可能有任意数量的空格或其他字符

正则表达式的与B总结

正则表达式RegExp

允许单词之间有空格的正则表达式

Python 正则表达式匹配两个字符之间的字符

正则表达式总结