[英]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)"
消耗了FG
, H
之后的尾隨空格與模式不匹配。
外觀:從左到右分析ABCDE FG H
。 該表達式與FG
匹配,並且正則表達式索引位於H
之前。 只有一個字母要匹配,但是(^|\\s)
需要空格或字符串開頭-該位置沒有字母。
要“修復”此問題並使用相同的邏輯,可以將PCRE regex gsub
與lookarunds結合使用 :
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"
包含單詞邊界,它們是不占用文本的零寬度斷言,因此,由於空格,正則表達式引擎可以同時匹配FG
和H
不消耗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.