簡體   English   中英

如何用正則表達式填補兩個字符之間的差距

[英]How to fill gap between two characters with regex

我有一個如下數據集。 我想用1來替換兩個1之間的所有點,如期望結果所示。 我可以用基礎R regex做到這一點嗎?

我試過了:

regexpr("^1\\.1$", my.data$my.string, perl = TRUE)

這是c#中的解決方案

兩個確切字符之間的字符

謝謝你的任何建議。

my.data <- read.table(text='
     my.string                           state
     ................1...............1.    A
     ......1..........................1    A
     .............1.....2..............    B
     ......1.................1...2.....    B
     ....1....2........................    B
     1...2.............................    C
     ..........1....................1..    C
     .1............................1...    C
     .................1...........1....    C
     ........1....2....................    C
     ......1........................1..    C
     ....1....1...2....................    D
     ......1....................1......    D
     .................1...2............    D
', header = TRUE, na.strings = 'NA', stringsAsFactors = FALSE)

desired.result <- read.table(text='
     my.string                           state
     ................11111111111111111.    A
     ......1111111111111111111111111111    A
     .............1.....2..............    B
     ......1111111111111111111...2.....    B
     ....1....2........................    B
     1...2.............................    C
     ..........1111111111111111111111..    C
     .111111111111111111111111111111...    C
     .................1111111111111....    C
     ........1....2....................    C
     ......11111111111111111111111111..    C
     ....111111...2....................    D
     ......1111111111111111111111......    D
     .................1...2............    D
', header = TRUE, na.strings = 'NA', stringsAsFactors = FALSE)

下面是使用帶有\\G功能和外觀斷言的gsub的選項。

> gsub('(?:1|\\G(?<!^))\\K\\.(?=\\.*1)', '1', my.data$my.string, perl = TRUE)
# [1] "................11111111111111111." "......1111111111111111111111111111"
# [3] ".............1.....2.............." "......1111111111111111111...2....."
# [5] "....1....2........................" "1...2............................."
# [7] "..........1111111111111111111111.." ".111111111111111111111111111111..."
# [9] ".................1111111111111...." "........1....2...................."
# [11] "......11111111111111111111111111.." "....111111...2...................."
# [13] "......1111111111111111111111......" ".................1...2............"

\\G功能是一個可以在兩個位置之一匹配的錨點; 字符串位置的開頭或最后一個匹配結束時的位置。 因為看起來你想避免字符串位置開頭的點,我們使用一個環繞斷言\\G(?<!^)來排除字符串的開頭。

\\K轉義序列重置報告的匹配的起始點,不再包括任何以前消耗的字符。

您可以在此處找到解釋正則表達式的整體細分。

使用gsubfn ,第一個參數是一個正則表達式,它匹配1和1之間的字符並捕獲后者。 第二個參數是一個函數,用公式表示法表示,它使用gsub將捕獲的字符串中的每個字符替換為1:

library(gsubfn)
transform(my.data, my.string = gsubfn("1(.*)1", ~ gsub(".", 1, x), my.string))

如果字符串中可以有多對1,則使用"1(.*?)1"作為正則表達式。

可視化這里的正則表達式很簡單,可以直接理解,但這里是一個debuggex可視化anwyays:

1(.*)1

正則表達式可視化

Debuggex演示

這是一個選項,它使用相對簡單的正則表達式和gregexpr()regmatches()regmatches<-()的標准組合來識別,提取,操作,然后替換匹配該正則表達式的子字符串。

## Copy the character vector
x <- my.data$my.string
## Find sequences of "."s bracketed on either end by a "1"
m <- gregexpr("(?<=1)\\.+(?=1)", x, perl=TRUE)
## Standard template for operating on and replacing matched substrings
regmatches(x,m) <- sapply(regmatches(x,m), function(X) gsub(".", "1", X))

## Check that it worked
head(x)
# [1] "................11111111111111111." "......1111111111111111111111111111"
# [3] ".............1.....2.............." "......1111111111111111111...2....."
# [5] "....1....2........................" "1...2............................."

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM