正则表达式替换“。”到 ”_”

Posted

技术标签:

【中文标题】正则表达式替换“。”到 ”_”【英文标题】:regex substitution "." to "_" 【发布时间】:2022-01-01 03:37:15 【问题描述】:

我对字符串中的字符替换有一个特定的问题:

如果我有以下字符串

"..A.B....c...A..D.."
"A..S.E.Q.......AW.."
".B.C..a...R......Ds"

我应该使用哪个正则表达式替换来替换点并获得以下字符串:

"A_B_c_A_D"
"A_S_E_Q_AW"
"B_C_a_R_Ds"

我正在使用 R。

提前致谢!

【问题讨论】:

这里真的需要正则表达式吗?您可以使用简单的规则迭代字符并删除/替换符号 到目前为止,您尝试了什么?为什么它不起作用? 是的,我想要正则表达式代码来解决我的问题的原因是避免迭代或任何其他循环代码 @Limey 我首先尝试使用 gsub(),但注意到它要复杂得多,而且我会得到比预期更多的“_”。 对于字符串sgsub('\\.*','_',s) 。您还删除了前导和尾随字符,s %>% gsub('\\.*','_',.) %>% gsub('^_','',.) %>% gsub('_$','',.) 【参考方案1】:

使用来自梦幻般的tidyversestringr

str1

str1 %>%
  #replace all dots that follow any word character ('\\.' escapes search, '+' matches one or more, '(?<=\\w)' followed by logic)
  str_replace_all('(?<=\\w)\\.+(?=\\w)', '_') %>%
  #delete remaining dots (i.e. at the start)
  str_remove_all('\\.')

和往常一样,用正则表达式给猫剥皮的方法很多

【讨论】:

【参考方案2】:

这里分两部分使用 gsub 的解决方案

string = c("..A.B....c...A..D..","A..S.E.Q.......AW..",".B.C..a...R......Ds")

先删除起点和终点

string2 = gsub("^\\.+|\\.+$", "", string)

最后用_替换一个或多个点

string2 = gsub("\\.+", "_", string2)

【讨论】:

【参考方案3】:

使用末尾注释中显示的 x,使用 trimws 修剪两端的点。点表示任何字符,因此我们必须用反斜杠对其进行转义以删除该含义。然后使用chartr将每个点替换为下划线。不使用任何包。

x |> trimws("both", "\\.") |> chartr(old = ".", new = "_")
## [1] "A_B____c___A__D"    "A__S_E_Q_______AW"  "B_C__a___R______Ds"

注意

x <- c("..A.B....c...A..D..",
"A..S.E.Q.......AW..",
".B.C..a...R......Ds")

【讨论】:

以上是关于正则表达式替换“。”到 ”_”的主要内容,如果未能解决你的问题,请参考以下文章

01_正则表达式_03_替换

正则表达式对文本的部分替换

正则表达式 [REGEX] - 替换/替换 - 捕获组 1 和 2 中的内容

在熊猫数据框中使用正则表达式替换列值

在 mySql 中使用正则表达式选择和替换数据

perl 正则表达式 匹配多行的问题