在 R 和正则表达式中,如何检测排除某些混合条件的字符

in r and regex, how to detect a character with excluding some mixed condition

提问人:mohsen0965 提问时间:8/2/2021 更新时间:8/2/2021 访问量:55

问:

我正在尝试检测字符串中的一些点 (.) 并将它们替换为单词旁边的相同点,例如“.” 变成 “.AAA“。但有一些条件我想避免替换:

  1. 如果有一个空格,然后在点前有一个字符
  2. 如果点在两个连字符 (-) 之间

例如,如果输入为:

string <- "first. - second. - third. 4."

我想要的输出是:

"first.AAA - second. - third.AAA 4."

对于第一个条件,我可以弄清楚这一点:

str_replace_all("[^ [A-Z19a-z]\\.]([\\.])","\\1AAA")

但是在阅读关于解决第二个条件并将两者混合在一起的前瞻和后瞻时感到困惑。

r 正则表达式

评论

0赞 Wiktor Stribiżew 8/2/2021
你指的是什么样的单字?任何非空格字符?或任何包含换行符的字符?还是只有字母数字?
0赞 Eric 8/2/2021
我不明白为什么.在“秒”之后不被替换。它看起来不符合你的两个条件
0赞 Wiktor Stribiżew 8/2/2021
@Eric 因为它位于两个连字符之间。

答:

2赞 Wiktor Stribiżew 8/2/2021 #1

如果单个字符是指任何字符,包括换行符,则可以使用

gsub("(?s)(?:\\s.\\.|-[^-]*-)(*SKIP)(?!)|(\\.)", "\\1AAA", x, perl=TRUE)

请参阅正则表达式演示。如果需要精确“任何字符”条件,请将未转义的点替换为适当的构造。\\s.\\.

细节

  • (?s)- 一个 dotall 标志,使点匹配任何字符,包括换行符s
  • (?:\s.\.|-[^-]*-)- 匹配以下任一的非捕获组
    • \s.\.- 一个空格,任何一个字符,一个点
    • |-或
    • -[^-]*-- 一个连字符,除连字符之外的零个或多个字符,然后是一个连字符
  • (*SKIP)(?!)- 跳过匹配,在当前位置失败,并从失败位置触发对下一个匹配项的搜索
  • |-或
  • (\.)- 第 1 组:一个点。

评论

0赞 mohsen0965 8/2/2021
哇,这是一个全面的答案,正则表达式演示中显示的结果正是我所需要的。但我不知道为什么当我在我的电脑 (Rstudio) 上运行它时,我只得到“\\1AAA”作为答案。有什么想法吗?
1赞 Wiktor Stribiżew 8/2/2021
@mohsen0965我不确定你到底在哪里使用这个正则表达式。它在我提供的功能中按预期工作。如果 gsub' 命令之外的替换模式存在问题,请尝试替换为 '$1.但是,您需要一个 PCRE 正则表达式引擎才能使用此正则表达式模式。gsub\\1
0赞 mohsen0965 8/2/2021
啊,我明白了。我正在使用 pipe 并且没有使用 x=。在代码中。多谢