2016-11-14 146 views
0

我試圖在Scala中組裝一個UDF,它從數據框中取出一列,並操縱它刪除HTML和其他無用的文本。在Scala中刪除單詞後的所有文本

我需要修改的列是非常混亂,有時有HTML,有時候沒有......搜索,所以我必須找到一個正則表達式解決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獲取刪除了「寄自」和所有的文字後不不。任何提示如何調整正則表達式使其工作?

編輯 在評論中指出,一個小錯字防止我的代碼工作,感謝您的幫助:

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

應該

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

只刪除'''''''發送'''.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()(或提取模式可以更好地精製)。

相關問題