簡體   English   中英

R中的(^ | \\\\ s)([AZ] {1,3})(\\\\ s | $)和\\\\ b [AZ] {1,2} \\\\ b正則表達式之間的差異

[英]Difference between (^|\\s)([A-Z]{1,3})(\\s|$) and \\b[A-Z]{1,2}\\b regular expressions in R

我正在嘗試清除R數據幀的一列中存儲的一些小字符串(1-3個字母)。 具體來說,假設下一個R腳本:

df = data.frame( "original" = c("ABCDE FG H",
                            "IJKL MN OPQRS", 
                            "TUV WX YZ AAAA"))
df$filter1 = gsub("(^|\\s)[A-Z]{1,2}($|\\s)", " ", df$original)
df$filter2 = gsub("\\b[A-Z]{1,2}\\b", " ", df$original)

> df

        original |    filter1 |    filter2  |
1     ABCDE FG H |    ABCDE H |    ABCDE    |
2  IJKL MN OPQRS | IJKL OPQRS | IJKL   OPQRS|
3 TUV WX YZ AAAA | TUV YZ AAAA|  TUV   AAAA |

我不明白為什么第一個過濾器(^|\\\\s)[AZ]{1,2}($|\\\\s)不替換第一行中的“ H”或第三行中的“ YZ” 。 我期望使用\\\\b[AZ]{1,2}\\\\b作為過濾器(filter2列)的結果相同。 請不要擔心多個空格,這對我來說並不重要(除非這將是問題:))。

我以為問題是操作的“全局性”,也就是說,如果發現第一個不替換第二個,但是如果我執行下一個替換就不正確:

> gsub("A", "X", "AAAABBBBCCCDDDDAAAAAAAEEE")
[1] "XXXXBBBBCCCDDDDXXXXXXXEEE"

那么,結果為何不同?

關鍵是gsub只能匹配不重疊的字符串。 FG是第一個預期匹配項, H是第二個預期匹配項,您可以看到這些字符串重疊 ,因此,在"(^|\\\\s)[AZ]{1,2}($|\\\\s)"消耗了FGH之后的尾隨空格與模式不匹配。

外觀:從左到右分析ABCDE FG H 該表達式與FG匹配,並且正則表達式索引位於H之前。 只有一個字母要匹配,但是(^|\\s)需要空格或字符串開頭-該位置沒有字母。

要“修復”此問題並使用相同的邏輯,可以將PCRE regex gsublookarunds結合使用

df$filter1 = gsub("(^|\\s)[A-Z]{1,2}(?=$|\\s)", " ", df$original, perl=TRUE)

要么

df$filter1 = gsub("(?<!\\S)[A-Z]{1,2}(?!\\S)", " ", df$original, perl=TRUE)

如果需要實際使用(刪除)空格,只需在之前(或之后)添加\\\\s*

第二個表達式"\\\\b[AZ]{1,2}\\\\b"包含單詞邊界,它們是不占用文本的零寬度斷言,因此,由於空格,正則表達式引擎可以同時匹配FGH不消耗。

暫無
暫無

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

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