【问题标题】: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|^) 开始,但这似乎不可能,因为“后视需要固定宽度的模式”。

【问题讨论】:

    标签: python regex whitespace lookahead lookbehind


    【解决方案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 频道中解释它并与您分享一个链接(频道链接在我的个人资料中)。
    猜你喜欢
    • 2013-07-09
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多