我需要以下正则表达式的帮助:word1 word2 word3 word4 1234.23,4
我想捕获word1 word2
,word3 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
是在第三输出列的第一行(第二捕获组)。
我该怎么办?
1条答案
按热度按时间fhity93d1#
如果您需要结果是一个 * 字符矩阵 *,在第一列中包含完全匹配,然后每个捕获组包含更多列,那么您可以使用
str_match
方法和正则表达式,如字符串
参见regex demo。
这里的要点是
\w+(?:\s{1,2}\w+)*
部分,它匹配一个或多个单词字符(\w+
),然后是一个或两个({1,2}
)空白(\s
)+一个或多个单词字符(\w+
)序列的零个或多个重复(*
)。如果你想得到一个和
test
一样长的 list,你可以使用strsplit
和一个简单的正则表达式,比如\s{3,}
,它只匹配三个或更多的空格。注意,你最好使用stringr::str_split
版本和这个模式,因为它默认匹配任何Unicode空格字符和这个速记字符类。