我正在处理 Stack Exchange 数据转储,我想从经常出现的代码中清理问题的主体。
我尝试使用 BeautifulSoup,但它留下了代码中出现的文本,我想删除 < pre >< code> 和 < /code > < /pre > 之间的所有内容。也许可以用正则表达式来完成?最好使用 Spark。
这样的东西可能有用
# re example
import re
s1 = "< pre >< code> some sample code < /code > < /pre >."
p = re.compile(r"< pre >< code>(.*?)< /code > < /pre >")
print(p.search(s1).group(1))
# convert to UDF
from pyspark.sql.functions import udf, col
from pyspark.sql.types import StringType
codeFinder = udf(lambda x: p.search(x).group(1), returnType=StringType())
df = df.withColumn('codeText', codeFinder(col('htmlCol')))
如果我误解了你的问题,而你想去掉代码块,那么这样的事情可能会奏效
# re example
import re
s2 = "a text < pre >< code> some sample code < /code > < /pre > b text"
s3 = "a text < pre >< code> some sample code < /code > < /pre > b text < pre >< code> some sample code < /code > < /pre > c text"
pattern = r"< pre >< code>(.*?)< /code > < /pre >"
print(re.sub(pattern=pattern, repl='', string=s2)) # a text b text
print(re.sub(pattern=pattern, repl='', string=s3)) # a text b text c text
# UDF example
from pyspark.sql.functions import udf, col
from pyspark.sql.types import StringType
codeStripper = udf(lambda x: re.sub(pattern=pattern, repl='', string=x), returnType=StringType())
df = df.withColumn('codelessText', codeStripper(col('htmlCol')))