gpt4 book ai didi

r - 使用 REGEX 在多个引号字符串中匹配和替换

转载 作者:行者123 更新时间:2023-12-04 10:16:21 25 4
gpt4 key购买 nike

我想在 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"

感谢帮助。

最佳答案

假设您需要匹配所有以 ' 开头的非重叠子字符串, 然后有 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 \ 的序列小号
  • \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

关于r - 使用 REGEX 在多个引号字符串中匹配和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44191045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com