regex:如何捕获一些单词,但它们之间最多只有一个或两个空格

x4shl7ld  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(46)

我需要以下正则表达式的帮助:
word1 word2 word3 word4 1234.23,4
我想捕获word1 word2word3 word4和数字。组中的单词数量可以变化,有时第二个捕获组不存在。
我尝试了以下正则表达式:
([\w\s-]+)\s{5,}([\w/ -]{0,100})\s+([\d,\.]+)
但我得到了


的数据
(python,这里:https://regex101.com/)。
我不知道如何定义一个正则表达式模式,它说“一些单词,但它们之间最多只有一个或两个空格”。我使用([\w/ -]{0,100})作为第二组,因为有时第二组不在这里。下面是R的工作示例:

test <- c("word1 word2                  word3 word4                   1234.23,4",
          "word1 word2                                                1946.27,4")

library(stringr)

str_match(test,"([\\w\\s-]+)\\s+([\\w/ -]{0,100})\\s+([\\d,\\.]+)")

     [,1]                                                                   [,2]                                                    [,3] [,4]       
[1,] "word1 word2                  word3 word4                   1234.23,4" "word1 word2                  word3 word4             " ""   "1234.23,4"
[2,] "word1 word2                                                1946.27,4" "word1 word2                                          " ""   "1946.27,4"

字符串
我想word3 word4是在第三输出列的第一行(第二捕获组)。
我该怎么办?

fhity93d

fhity93d1#

如果您需要结果是一个 * 字符矩阵 *,在第一列中包含完全匹配,然后每个捕获组包含更多列,那么您可以使用str_match方法和正则表达式,如

rx <- "^(\\w+(?:\\s{1,2}\\w+)*)\\s+(.*?)\\s+(\\d+(?:[.,]\\d+)*)$"

字符串
参见regex demo
这里的要点是\w+(?:\s{1,2}\w+)*部分,它匹配一个或多个单词字符(\w+),然后是一个或两个({1,2})空白(\s)+一个或多个单词字符(\w+)序列的零个或多个重复(*)。
如果你想得到一个和test一样长的 list,你可以使用strsplit和一个简单的正则表达式,比如\s{3,},它只匹配三个或更多的空格。注意,你最好使用stringr::str_split版本和这个模式,因为它默认匹配任何Unicode空格字符和这个速记字符类。

相关问题