我想用R中的下划线替换引号中的所有空格。当不止一个时,我不确定如何正确定义引用的字符串。我的开始努力失败了,我甚至没有接受单/双引号。
require(stringi)
s = "The 'quick brown' fox 'jumps over' the lazy dog"
stri_replace_all(s, regex="('.*) (.*')", '$1_$2')
#> [1] "The 'quick brown' fox 'jumps_over' the lazy dog"
感激帮助。
答案 0 :(得分:4)
我们假设您需要匹配以'
开头的所有非重叠子字符串,然后包含除'
以外的1个或多个字符,然后以'
结尾。模式为'[^']+'
。
然后,您可以使用以下基本R代码:
x = "The 'quick cunning brown' fox 'jumps up and over' the lazy dog"
gr <- gregexpr("'[^']+'", x)
mat <- regmatches(x, gr)
regmatches(x, gr) <- lapply(mat, gsub, pattern="\\s", replacement="_")
x
## => [1] "The 'quick_cunning_brown' fox 'jumps_up_and_over' the lazy dog"
见this R demo。或者,使用gsubfn
:
> library(gsubfn)
> rx <- "'[^']+'"
> s = "The 'quick cunning brown' fox 'jumps up and over' the lazy dog"
> gsubfn(rx, ~ gsub("\\s", "_", x), s)
[1] "The 'quick_cunning_brown' fox 'jumps_up_and_over' the lazy dog"
>
要支持转义序列,您可以使用更复杂的PCRE正则表达式:
(?<!\\)(?:\\{2})*\K'[^'\\]*(?:\\.[^'\\]*)*'
<强>详情:
(?<!\\)
- 紧靠当前位置之前的\
(?:\\{2})*
- 零个或多个2 \
s \K
- 匹配重置运算符'
- 单引号[^'\\]*
- 除'
和\
以外的零个或多个字符(?:\\.[^'\\]*)*
- 零个或多个序列:
\\.
- \
后跟任何字符,但换行符[^'\\]*
- 除'
和\
以外的零个或多个字符'
- 单引号。R demo看起来像
x = "The \\' \\\\\\' \\\\\\\\'quick \\'cunning\\' brown' fox 'jumps up \\'and\\' over' the lazy dog"
cat(x, sep="\n")
gr <- gregexpr("(?<!\\\\)(?:\\\\{2})*\\K'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'", x, perl=TRUE)
mat <- regmatches(x, gr)
regmatches(x, gr) <- lapply(mat, gsub, pattern="\\s", replacement="_")
cat(x, sep="\n")
输出:
The \' \\\' \\\\'quick \'cunning\' brown' fox 'jumps up \'and\' over' the lazy dog
The \' \\\' \\\\'quick_\'cunning\'_brown' fox 'jumps_up_\'and\'_over' the lazy dog
答案 1 :(得分:1)
试试这个:
require(stringi)
s = "The 'quick brown' fox 'jumps over' the lazy dog"
stri_replace_all(s, regex="('[a-z]+) ([a-z]+')", '$1_$2')