2015-06-10 4 views
2

У меня есть строка - цепочка писем, мне нужно было извлечь имя отправителя (From :). Ниже вы найдете образец электронной почтыИзвлечь имя из письма с помощью регулярного выражения в R

str1 <- 'From : Wendy YEOW (SLA) To : [email protected] Subject : RE: [email protected] 
From: SLA Enquiry (SLA) Sent: Friday, 5 June, 2015 5:26 PM To : [email protected] Subject : RE: [email protected] 
From: Siti Zaharah RAMAN (ARKS) Sent: Friday, 5 June, 2015 5:26 PM To : [email protected] Subject : RE: [email protected] 
From: SLA Enquiry (SLA) Sent: Friday, 5 June, 2015 5:26 PM To : [email protected] Subject : RE: [email protected] 
From: Chin Hwang LAU (TA) Sent: Friday, 5 June, 2015 5:26 PM To : [email protected] Subject : RE: [email protected]' 

У меня есть ниже код - для извлечения имен

str_extract_all(string=str1,pattern="\\b(From\\s*[:]+\\s*(\\w*))\\b")[[1]] 
[1] "From : Wendy" "From: SLA" "From: Siti" "From: SLA" "From: Chin" 

Но мой желаемый результат:

[1] "Wendy YEOW (SLA)" "SLA Enquiry (SLA)" "Siti Zaharah RAMAN (ARKS)" "SLA Enquiry (SLA)" "Chin Hwang LAU (TA)" 

ответ

3

Вы можете использовать strsplit. Здесь нет необходимости в gsub.

strsplit(str1, "From ?: | (To|Sent) ?:.*?(\\nFrom ?: |$)")[[1]][-1] 
# [1] "Wendy YEOW (SLA)"   "SLA Enquiry (SLA)"   "Siti Zaharah RAMAN (ARKS)" 
# [4] "SLA Enquiry (SLA)"   "Chin Hwang LAU (TA)" 

Регулярное выражение в основном состоит из двух частей:

  1. "From ?: ": Это исто начало строки. Сплит возвращает пустую строку и остальную часть исходной строки.
  2. " (To|Sent) ?:.*?(\\nFrom ?: |$)": Это регулярное выражение представляет текст после имени. Он включает подстроку, начинающуюся с "To" или "Sent" и заканчивая разрывом строки ("\\n"), а затем следующим "From" или концом строки ("$").

Наконец, [-1] необходимо удалить пустую строку (перед первой "From").

+0

Это аккуратно, и я хотел бы понять, почему это работает. Не могли бы вы добавить комментарий? – Andrie

+0

@ Andrie Я добавил объяснение. –

+0

Спасибо. Я перейду и перечитаю, как 'strsplit' имеет дело с регулярным выражением. (+1) – Andrie

1

Не очень элегантный, но вы можете попробуйте:

gsub(" *(From|To|Sent) *:? *","",regmatches(str1,gregexpr("From *:[^:]+",str1))[[1]]) 
#[1] "Wendy YEOW (SLA)"   "SLA Enquiry (SLA)"   
#[3] "Siti Zaharah RAMAN (ARKS)" "SLA Enquiry (SLA)"   
#[5] "Chin Hwang LAU (TA)" 
+0

Если имя somthing like 'From: Tony Kwa/Ke DY' - приведенный выше код вводится в' ny Kwa/Ke DY'. Он удаляет слово To из фактического имени - –

3

Попробуйте это регулярно выражение вместе с strsplit():

gsub("From *: (.*?) (To|Sent).*", "\\1", strsplit(str1, "\n")[[1]]) 

[1] "Wendy YEOW (SLA)"   
[2] "SLA Enquiry (SLA)"   
[3] "Siti Zaharah RAMAN (ARKS)" 
[4] "SLA Enquiry (SLA)"   
[5] "Chin Hwang LAU (TA)" 

Это работает, потому что я использую обратную ссылку (\\1) для извлечения подстановочные в первом наборе скобок.

Смежные вопросы