Регулярное выражение для известных начальных и конечных символов в Perl и R-lang

Я ищу соответствие упоминаниям foo в имени пользователя. Мне нужно иметь возможность сопоставлять текстовые строки, начинающиеся с «@» и содержащие слово «foo» в любом месте в этом имени пользователя, заканчивающиеся пробелом или грамматикой.

Мне нужно иметь возможность сопоставить:

пример 1: @anycharacterhere_foo, что-нибудь еще здесь

пример 2: @foo_anymorecharacters здесь

Я хочу использовать библиотеку stringr следующим образом:

str_extract_all(x, perl("?<=@"))

Чего я не понимаю, так это функции match all


person lmcshane    schedule 06.08.2015    source источник


Ответы (2)


Предполагая, что ваши имена пользователей не будут иметь специальных символов:

x <- "@anycharacterhere_foo, anything else here"
username <- str_extract_all(x, "\\w*(foo)\\w*")

который дает строку с вашим именем пользователя. Это поднимет дополнительные foos в оставшейся строке, но вы можете исправить это с помощью str_extract, а не всех. Я не уверен, действительно ли вам нужно все foo из строки или просто имя пользователя, которое в вашем примере данных находится в начале. Вы также можете ограничить это совпадением all, включив @, таким образом:

username <- str_extract_all(x, "\\@\\w*(foo)\\w*")
person Shawn Mehan    schedule 06.08.2015

Вам нужно искать «ноль или более» словесных символов, которые предшествуют или следуют за:

x <- '@anycharacterhere_foo @foo_anymorecharacters here anything else here'
str_extract_all(x, '@\\w*foo\\w*')[[1]]
# [1] "@anycharacterhere_foo"  "@foo_anymorecharacters"

Если вы не хотите включать маркер:

str_extract_all(x, '(?<=@)\\w*foo\\w*')[[1]]
# [1] "anycharacterhere_foo"  "foo_anymorecharacters"

Вы также можете использовать для этого rm_tag из пакета qdapRegex:

library(qdapRegex)
rm_tag(x, extract=TRUE)[[1]]
# [1] "@anycharacterhere_foo"  "@foo_anymorecharacters"
person hwnd    schedule 06.08.2015