PySpark 2 - 正则表达式替换 <BR> 之前的所有内容

Posted

技术标签:

【中文标题】PySpark 2 - 正则表达式替换 <BR> 之前的所有内容【英文标题】:PySpark 2 - Regex replace everything before <BR> 【发布时间】:2018-08-07 22:03:42 【问题描述】:

我有一个类似的记录

"_row"\n"<BR>Datetime:2018.06.30^
Name:ABC^
Se:4^
Machine:XXXXXXX^
InnerTrace:^
AdditionalInfo:^
<ER>

我想删除每条记录中 之前的所有内容。有没有一种简单的方法可以使用 spark 数据框来做到这一点

import pyspark.sql.functions as f

data.select(f.regexp_replace(pattern='\n<BR>',replacement="<BR>",str="row")

像这样?模式应该是什么?

【问题讨论】:

【参考方案1】:

要匹配直到字符串开头的所有字符,您可以使用.*&lt;BR&gt;。但是,这不匹配换行符 (\n)。我找到了here 的解决方案,所以我们的模式可能是(?s).*&lt;BR&gt;。下面给出了一个工作示例,希望对您有所帮助!

import pyspark.sql.functions as F

df = spark.createDataFrame([('''"_row"\n"<BR>Datetime:2018.06.30^
Name:ABC^
Se:4^
Machine:XXXXXXX^
InnerTrace:^
AdditionalInfo:^
<ER>''',), ],schema=['text'])

df = df.withColumn('text_cleaned',
               F.regexp_replace(F.col('text'),pattern='(?s).*<BR>',replacement="<BR>"))

让我们验证它是否有效;

print(df.select('text').collect()[0][0])

输出

"_row"
"<BR>Datetime:2018.06.30^
Name:ABC^
Se:4^
Machine:XXXXXXX^
InnerTrace:^
AdditionalInfo:^
<ER>

print(df.select('text_cleaned').collect()[0][0])

输出:

<BR>Datetime:2018.06.30^
Name:ABC^
Se:4^
Machine:XXXXXXX^
InnerTrace:^
AdditionalInfo:^
<ER>

【讨论】:

以上是关于PySpark 2 - 正则表达式替换 <BR> 之前的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

pyspark用正则表达式替换正则表达式

如何在 PySpark 中编写条件正则表达式替换?

如何在 pySpark 中有效地从字符串数据框中替换多个正则表达式模式的所有实例?

正则表达式,替换 指定范围内 的 特定字符串

PySpark 2 - 正则表达式取代之前的一切

PySpark textFile 命令中的正则表达式