簡體   English   中英

R正則表達式 - 提取以@符號開頭的單詞

[英]R regex - extract words beginning with @ symbol

我正在嘗試使用R的stringr包從推文中提取twitter句柄。 例如,假設我想要在矢量中以“A”開頭的所有單詞。 我可以這樣做

library(stringr)

# Get all words that begin with "A"
str_extract_all(c("hAi", "hi Ahello Ame"), "(?<=\\b)A[^\\s]+")

[[1]]
character(0)

[[2]]
[1] "Ahello" "Ame"   

大。 現在讓我們嘗試使用“@”而不是“A”來做同樣的事情

str_extract_all(c("h@i", "hi @hello @me"), "(?<=\\b)\\@[^\\s]+")

[[1]]
[1] "@i"

[[2]]
character(0)

為什么這個例子給出了我期望的相反結果以及如何解決它?

看起來你可能意味着

str_extract_all(c("h@i", "hi @hello @me", "@twitter"), "(?<=^|\\s)@[^\\s]+")
# [[1]]
# character(0)
# [[2]]
# [1] "@hello" "@me" 
# [[3]]
# [1] "@twitter"

正則表達式中的\\b是邊界,它出現在“字符串中的兩個字符之間,其中一個是單詞字符,另一個不是單詞字符。” 看到這里 由於空格和“@”都是非單詞字符,因此“@”之前沒有邊界。

使用此修訂版,您可以匹配字符串的開頭或空格之后的值。

關於你的正則表達式的一些事情:

  • (?<=\\b)\\b相同,因為字邊界已經是零寬度斷言
  • \\@@相同,因為@不是特殊的正則表達式元字符,你不必逃避它
  • [^\\s]+\\S+相同,幾乎所有的速記字符類都在正則表達式中具有否定的對應物。

所以,你的正則表達式, \\b@\\S+ ,匹配@i in h@i因為h (字母,單詞字符)和@ (非字母字符,不是字母,數字或下划線)之間有一個單詞邊界)。 檢查這個正則表達式調試器

\\b是一個模糊的模式,其含義取決於正則表達式上下文 在您的情況下,您可能希望使用\\B ,一個非字邊界,即\\B@\\S+ ,它將匹配@前面帶有非字char或字符串開頭的@。

x <- c("h@i", "hi @hello @me")
regmatches(x, gregexpr("\\B@\\S+", x))
## => [[1]]
## character(0)
## 
## [[2]]
## [1] "@hello" "@me"   

請參閱正則表達式演示

如果你想擺脫這個\\b / \\B模糊性,使用帶有字符串方法的外觀或使用perl=TRUE參數的基本R regex函數來使用明確的字邊界:

regmatches(x, gregexpr("(?<!\\w)@\\S+", x, perl=TRUE))
regmatches(x, gregexpr("(?<!\\S)@\\S+", x, perl=TRUE))

哪里:

  • (?<!\\w) - 一個明確的起始詞邊界 - 是一個負面的lookbehind,確保在當前位置或字符串開頭的左邊有一個非單詞字符串
  • (?<!\\S) - 一個空白的起始詞邊界 - 是一個負面的lookbehind,它確保在當前位置或字符串開頭的左邊有一個空白字符。

在這里查看此正則表達式演示另一個正則表達式演示

注意,相應的右手邊界是(?!\\w)(?!\\S)

上面的答案應該足夠了。 如果您只想獲取用戶名,這將刪除@符號。

str_extract_all(c("@tweeter tweet", "h@is", "tweet @tweeter2"), "(?<=\\B\\@)[^\\s]+")
[[1]]
[1] "tweeter"

[[2]]
character(0)

[[3]]
[1] "tweeter2"

雖然我不是正則表達式的專家,但似乎問題可能是@符號與單詞字符不對應,因此匹配單詞開頭的空字符串( \\\\b )不起作用,因為有當@在該單詞之前時,沒有空字符串。

這里有兩個很棒的正則表達式資源,以防您沒有看到它們:

暫無
暫無

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

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