我在R中使用正则表达式。
我的问题与this one有些类似,但我需要一个更具体的解决方案。我有一个角色向量。每个字符串的格式如下:
stringr
文本块之间有很多空格。我想从每个字符串中提取text1。 Text1在任何一侧始终至少有两个空格,但每个其他文本块也是如此。 Text1将是一个名为“Monty Python”的名称:可能包含空格,但绝不包含两个空格。
我正在使用str_extract
,str_extract(z, "\\s{2,}[a-z]*\\s{2,}")
函数仅提取模式的第一次出现。但我不知道如何指定我的模式。我试过modal-body
,表示我希望空格之间至少有一个字母。这导致了NA。有没有办法隔离text1?
答案 0 :(得分:1)
您需要确认字母大小写,因为您的子字符串可能包含大写/小写字母,并包含一个可选的组构造以匹配子字符串的第二个字实例。
字符向量(基于您对输入的描述):
x <- c('foo Monty Python baz quz',
'foo Monty baz quz')
使用 stringr 包:
str_trim(str_extract(x, "\\s{2,}[a-zA-Z]+( [a-zA-Z]+)?\\s{2,}"))
# [1] "Monty Python" "Monty"
使用基础R中的正则表达式:
trimws(regmatches(x, gregexpr('\\s{2,}[a-zA-Z]+( [a-zA-Z]+)?\\s{2,}', x)))
# [1] "Monty Python" "Monty"
虽然,我只想在这里使用 strsplit :
sapply(strsplit(x, '\\s{2,}'), '[', 2)
# [1] "Monty Python" "Monty"