我在名为“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/