提取两个字符串之间不同的字符

问题描述 投票:0回答:7

我使用

adist
来计算两个字符串之间不同的字符数:

a <- "Happy day"
b <- "Tappy Pay"
adist(a,b) # result 2

现在我想提取那些不同的字符。在我的示例中,我想获取字符串

"Hd"
(或
"TP"
,这并不重要)。

我尝试查看

adist
agrep
stringi
,但什么也没找到。

r string character
7个回答
30
投票

您可以使用以下操作顺序:

  • 使用
    strsplit()
    分割字符串。
  • 使用
    setdiff()
    比较元素
  • 包裹在一个归约函数中

试试这个:

Reduce(setdiff, strsplit(c(a, b), split = ""))
[1] "H" "d"

7
投票

拆分成字母并取差值作为集合:

> setdiff(strsplit(a,"")[[1]],strsplit(b,"")[[1]])
[1] "H" "d"

5
投票

对此并不感到自豪,但它似乎完成了工作:

sapply(setdiff(utf8ToInt(a), utf8ToInt(b)), intToUtf8)

结果:

[1] "H" "d"

4
投票

只要

a
b
具有相同的长度,我们就可以这样做:

s.a <- strsplit(a, "")[[1]]
s.b <- strsplit(b, "")[[1]]
paste(s.a[s.a != s.b], collapse = "")

给予:

[1] "Hd"

就代码的清晰度而言,这似乎很简单,并且似乎与此处提供的最快的解决方案相关,尽管我认为我更喜欢

f3

f1 <- function(a, b)
  paste(setdiff(strsplit(a,"")[[1]],strsplit(b,"")[[1]]), collapse = "")

f2 <- function(a, b)
  paste(sapply(setdiff(utf8ToInt(a), utf8ToInt(b)), intToUtf8), collapse = "")

f3 <- function(a, b) 
  paste(Reduce(setdiff, strsplit(c(a, b), split = "")), collapse = "")

f4 <- function(a, b) {
  s.a <- strsplit(a, "")[[1]]
  s.b <- strsplit(b, "")[[1]]
  paste(s.a[s.a != s.b], collapse = "")
}

a <- "Happy day"
b <- "Tappy Pay"

library(rbenchmark)
benchmark(f1, f2, f3, f4, replications = 10000, order = "relative")[1:4]

在我的笔记本电脑上进行新的会话时提供以下内容:

  test replications elapsed relative
3   f3        10000    0.07    1.000
4   f4        10000    0.07    1.000
1   f1        10000    0.09    1.286
2   f2        10000    0.10    1.429

我假设差异一定是在相应的字符位置上。您可能想澄清这是否是有意的。


3
投票

您可以使用其中一个变量作为正则表达式字符类,并从另一个变量中使用

gsub

gsub(paste0("[",a,"]"),"",b)
[1] "TP"
gsub(paste0("[",b,"]"),"",a)
[1] "Hd"

1
投票

下面的函数可能是解决此类问题的更好选择。

list.string.diff <- function(a, b, exclude = c("-", "?"), ignore.case = TRUE, show.excluded = FALSE)
{
if(nchar(a)!=nchar(b)) stop("Lengths of input strings differ. Please check your input.")
if(ignore.case)
{
a <- toupper(a)
b <- toupper(b)
}
split_seqs <- strsplit(c(a, b), split = "")
only.diff <- (split_seqs[[1]] != split_seqs[[2]])
only.diff[
(split_seqs[[1]] %in% exclude) |
(split_seqs[[2]] %in% exclude)
] <- NA
diff.info<-data.frame(which(is.na(only.diff)|only.diff),
split_seqs[[1]][only.diff],split_seqs[[2]][only.diff])
names(diff.info)<-c("position","poly.seq.a","poly.seq.b")
if(!show.excluded) diff.info<-na.omit(diff.info)
diff.info

来自 https://www.r-bloggers.com/extract- Different-characters- Between-two-strings-of-equal-length/

然后就可以跑了

list.string.diff(a, b)

获得差异。


0
投票

我已经能够使用以下代码获得两个字符串之间的差异:

library(rmarkdown)
library(diffr)
library(pagedown)
library(RDCOMClient)

print_Visual_File_Difference_Between_Text_To_Html <- function(text1, text2, output_Filepath)
{
  file1 <- tempfile(fileext = ".txt")
  writeLines(text1, con = file1)
  file2 <-  paste0(tempfile(), ".txt")
  writeLines(text2, con = file2)
  rmd_File <- tempfile(fileext = ".rmd")
  command_Diff <- paste0("diffr(", paste0("'", file1, "'"), ", ", paste0("'", file2, "'"), ", ", "before = 'Text 1', after = 'Text 2')")
  command_Diff <- str_replace_all(string = command_Diff, pattern = "\\\\", replacement = "/")

  rmd_Text <- c("---", "title: 'Text comparison between files'", "output: html_document",
                "---", "```{r file comparison, echo = FALSE}", "library(diffr)", command_Diff, "```")

  writeLines(rmd_Text, con = rmd_File)
  rmarkdown::render(rmd_File)
  rmd_Html  <- stringr::str_replace(string = rmd_File, pattern = "\\.rmd", replacement = "\\.html")
  file.copy(from = rmd_Html, to = output_Filepath)
}

setwd("C:\\")
text1 <- "Mon nom est Emmanuel Hamel. Mon adresse est le 324 jorge 1. Mon numéro de tel est 591-452-4000"
text2 <- "Mon nom est Emmanuel Hamel. Mon adresse est le xxxxxxx. Mon numéro de tel est xxxxxxx"
print_Visual_File_Difference_Between_Text_To_Html(text1, text2, output_Filepath = "comparaison.html")
chrome_print("comparaison.html")

IEApp <- COMCreate("InternetExplorer.Application")
IEApp[['Visible']] <- TRUE
IEApp$Navigate2("C:\\comparaison.html")
doc <- IEApp$Document()
web_Obj_Char_Delete <- doc$getElementsByClassName("char-delete")
web_Obj_Char_Insert <- doc$getElementsByClassName("char-insert")

> web_Obj_Char_Delete$Item(0)$innerText()
[1] "324 jorge 1"
> web_Obj_Char_Insert$Item(0)$innerText()
[1] "xxxxxxx"
> web_Obj_Char_Delete$Item(1)$innerText()
[1] "591-452-4000"
> web_Obj_Char_Insert$Item(1)$innerText()
[1] "xxxxxxx"

我使用 Internet Explorer 以本地模式读取 html 文件。也可以使用硒。请参阅:使用 RSelenium 打开本地 HTML 文件

© www.soinside.com 2019 - 2024. All rights reserved.