2016-11-14 10 views
0

データフレームから列を取り除き、HTMLやその他の無駄なテキストを削除するUDFをScalaでアセンブルしようとしています。Scalaの一連の単語の後に文字列のすべてのテキストを削除します

私は変更する必要があるカラムが非常に厄介で、時々HTMLがあり、時々私は私が今までで達成したいものをremove HTML

に正規表現のソリューションを発見したSO検索しています...がありませんテキスト内の特定の単語を見つけてその単語の後にあるすべてのテキストを削除できる正規表現を見つけます。

私は私はあなたが)後にすべてを削除する場合は正規表現は\).*のようなものでなければならないこと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 

HTMLは、「から送られた」と、すべてのテキストが後に行いを取り除く取得しながら

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]""", " ") 
    ) 

:私はこれまで持っていることのようなものですない。どのように正規表現を動作させるために調整するヒント?

EDIT コメントで指摘したように、小さなタイプミスが動作するように私のコードを防ぐ、助けてくれてありがとう:

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

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

「from Sent from」から「 '」記号を取り除くだけです:.replaceAll( "" ""送信元* "" "、" ")' –

+1

'val toStringNoHTML = udf [String、String](_。toString .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()を追加することができます(または抽出パターンを改善することができます)。

関連する問題