apache-spark - 如果子字符串存在于两个字符串之间,则提取两个字符串之间的文本

标签 apache-spark pyspark apache-spark-sql

我在名为“message”的列中有一个原始文本,如下所示:

示例数据框

Date               message
2020-11-01         ['some not required text1', 'Startstring , 
                   'some not required text2', MandatorySubstring , 'some not 
                    required text3', 'ID :AB_CD, 'Stopstring' 'some not 
                    required text4', 'Startstring ID :cd_ab', 'some not 
                    required text5', 'ID :ghed','some not required text6', ID :zyx', 'Stopstring 'some 
                    not required text7']
2020-11-02         ['some not required text8', Startstring 'ID :ABCD', 
                   'some not required text9', 'ID :ED_GH', 'some not 
                    required text10', ID :X_YZ, Stopstring 'some not 
                    required text11', 'Startstring 
                    'some not required text12',MandatorySubstring 
                    'some not required text13', ID :z_yx', 'some not required text14''Stopstring 
                    'some not required text15']

如果 Startstring 和 Stopstring 之间存在 MandatorySubstring,我希望提取 ID : 之后 Startstring 和 Stopstring 之间的字符串,如果 Startstring 和 Stopstring 之间不存在 MandatorySubstring,则丢弃 ID。一个日期中可能有多个此类实例。

预期输出:

Date               message
2020-11-01         AB_CD 
2020-11-02         z_yx

我尝试了以下模式:

pattern = StartString\s*((?:(?!StartString).)*?MandatoryString 1.*?)\s*Stopstring

它为我提供了开始字符串和停止字符串之间的所有文本。我现在不知道如何从该文本中提取 ID: 之后的文本。

任何人都可以为我提供此场景的正则表达式模式吗?非常感谢这方面的帮助。谢谢

最佳答案

鉴于当前的输入,我建议

Startstring(?:(?!Startstring).)*?MandatorySubstring(?:(?!Startstring).)*?,['\s]*ID\s*:\s*([^',]*).*?Stopstring

请参阅regex demo 。详情:

  • Startstring - 左侧分隔符
  • (?:(?!Startstring).)*? - 任何零个或多个字符,每个字符不启动 Startstring 字符序列
  • MandatorySubstring - 必须出现在左右分隔符之间的字符串
  • (?:(?!Startstring).)*? - 任何零个或多个字符,每个字符不启动 Startstring 字符序列
  • , - 逗号
  • ['\s]* - 零个或多个 ' 或空格
  • ID - 字符串
  • \s*:\s* - 冒号内有零个或多个空格
  • ([^',]*) - 第 1 组:除 ',
  • 之外的任何零个或多个字符
  • .*? - 除换行符之外的任何零个或多个字符,尽可能少
  • Stopstring - 右侧分隔符。

关于apache-spark - 如果子字符串存在于两个字符串之间,则提取两个字符串之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65191877/

相关文章:

python - 压缩包后 Pyspark 找不到合适的 TLS CA 证书

apache-spark - Spark : Measuring performance of ALS

apache-spark - PySpark 数据框 to_json() 函数

python - 删除 Spark 数据框中包含句点的列名称

apache-spark - 尝试使用 'overwrite'模式将DataFrame保存为拼花格式时出现FileNotFoundException

python - SystemML:无法导入子模块 mllearn (因此无法导入 Keras2DML 函数)

python - pyspark 将数据帧写入 hdfs 失败

azure - 将 Spark 时间戳保存到 Azure Synapse datetime2 时出现问题(7)

apache-spark - Pyspark - saveAsTable - 如何将新数据插入现有表?

apache-spark - Spark结构化流作业在群集模式下失败