[英]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
)不起作用,因為有當@在該單詞之前時,沒有空字符串。
這里有兩個很棒的正則表達式資源,以防您沒有看到它們:
Stringr的Regex頁面 ,也可用作插圖:
vignette("regular-expressions", package = "stringr")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.