2016-11-14 2 views
0

Я пытаюсь собрать UDF в Scala, который берет столбец из фрейма данных и обрабатывает его, чтобы удалить HTML и другие бесполезные фрагменты текста.Удалите весь текст из строки после последовательности слов в Scala

Столбец Мне нужно изменить очень неаккуратно, иногда есть HTML, иногда нет ... Поиск SO Я нашел регулярки решения remove HTML

, что я хотел бы достичь в настоящее время является найти регулярное выражение, которое может найти определенное слово в тексте и удалить весь текст после этого слова.

Я думаю, что я понял из this SO answer, что регулярное выражение должно быть что-то вроде \).*, если вы хотите, чтобы удалить все после ), так что я пытаюсь адаптировать это к моему делу, но безуспешно из-за мое отсутствие знаний о регулярных выражениях.

У меня есть строки, как:

I am interested to hear from you, thanks Sent from iPhone other stuff I want to delete.... 

Я хотел бы сохранить первую часть строки до «Направлено из» исключены, так идеальный результат будет:

I am interested to hear from you, thanks 

То, что я до сих пор что-то вроде:

val toStringNoHTML = udf[String, String](_.toString 
    // code from SO as linked above 
    .replaceAll("""<(?!\/?a(?=>|\s.*>))\/?.*?>""", " ") 
    // delete all text after key word 
    .replaceAll("""'Sent from'.*""", "") 
    // remove all punctuation 
    .replaceAll("""[\p{Punct}\n]""", " ") 
    ) 

в то время как HTML получает удалить, то «Направлено» и весь текст после того, как делает не. Любой намек на то, как настроить регулярное выражение, чтобы заставить его работать?

EDIT как было указано в комментарии, небольшой опечатка предотвращено код, чтобы работать, спасибо за помощь:

.replaceAll("""'Sent from'.*""", "") 

должен быть

.replaceAll("""Sent from.*""", "") 
+2

просто удалите знаки '' 'из' Sent from': .replaceAll ("" "Отправлено с. *" "", "") ' –

+1

' val toStringNoHTML = udf [String, String] (_. ToString .replaceAll ("" "<(?!\/?a(?=> | \ s. *>)) \ /?. *?>" "", "") .replaceAll ("Отправлено из (. *)", "") .replaceAll ("[\ p {Punct} \ n] "," "))' – mrsrinivas

ответ

0

Вместо того, чтобы делать несколько replaceAll(pattern, blank) У меня возникло бы желание начать добычу.

val msgRE = "(.*>)?(.*)Sent from.*".r 

val result = udfStr match { 
    case msgRE(_, msg) => Some(msg.trim) // .replaceAll() can be added here 
    case _ => None 
} 

Здесь результат является Option[String], но это действительно зависит от того, как вы хотите обрабатывать входные данные без согласования.

Если после извлечения требуется дополнительная очистка, то можно добавить replaceAll(), где указано (или образец экстракции лучше уточнить).

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