比赛前后没有捕获组的Spark正则表达式无法按预期运行

时间:2018-10-31 22:14:17

标签: java regex apache-spark pyspark

我一直在努力使正则表达式正常工作。经过大量谷歌搜索和与同事协商,它仍然没有按预期工作。

我有一组要捕获的目标词(请参见注释行中的术语示例),以及周围的3个词以构成摘要字符串。以下是对PySpark数据框中的字符串执行此操作的函数:

def extract_snippet(df, text_col):

    e = ["rt", "lt", "bi"]
    before = r"(?:\S+\s+){0,3}"
    after = r"\s*(?:\S+\b\s*){0,3}"

    for eye in e:
        if eye == "rt":
            # terms: right, od, rt, r eye, r_eye
            p = before + r"\b[oO]{1}[dD]{1}\b|\b[rR]{1}(?:igh|IGH)?[tT]{1}\b|\b[rR]{1}[^a-zA-Z0-9]{0,4}eye{1}\b" + after
        elif eye == "lt":
            # terms: left, os, lt, l eye, l_eye
            p = before + r"\b[oO]{1}[sS]{1}\b|\b[lL]{1}(?:ef|EF)?[tT]{1}\b|\b[lL]{1}[^a-zA-Z0-9]{0,4}eye{1}\b" + after
        else:
            # ou, bi, bilat, bilateral, both
            p = before + r"\b[oO]{1}[uU]{1}\b|\b(?:bi|BI|Bi){1}(?:lat|LAT|LATERAL|lateral)?\b|\b(?:both|BOTH|Both){1}\b" + after

        snippet_udf = udf(lambda s: re.findall(p, s), ArrayType(StringType()))
        df = df.withColumn(eye + "_snippet", snippet_udf(col(text_col)))

    return df

我需要将表达式打断,因为“ p”会根据目标词而变化

以下是一些示例:

示例1:

Type 2 diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema, left eye Care Plan:

我希望它返回的内容:

'with macular edema, left eye Care Plan'

我得到的是什么

'left'

示例2:

Primary open-angle glaucoma, moderate stage Comments : IOP STILL ELEVATED OD Visual Field and ONA reviewed with patient

我希望它返回的内容:

'IOP STILL ELEVATED OD Visual Field and '

我得到的是什么

'IOP STILL ELEVATED OD'

这些示例在正则表达式测试器here中按预期(完全匹配)工作,但是当我将其应用于Spark数据帧列中的字符串转换时,效果不佳。

对于类似于示例2的某些字符串,正则表达式似乎可以捕获目标单词之前而不是之后的单词(我知道.findall()只会返回非-重叠的单词,这不是问题。)

我尝试使用Java regex测试器而不是像链接中的Python测试器那样的测试器,但是我得到了相同的(正确的)输出,所以我迷路了。

在Presto中,这非常有效:

SELECT regexp_extract_all(col_name, '((?:\S+\s+){0,3}(\b[oO]{1}[sS]{1}\b|\b[lL]{1}(ef|EF)?[tT]{1}\b|\b[lL]{1}[^a-zA-Z0-9]{0,4}eye{1}\b)\s*(?:\S+\b\s*){0,3})') FROM ...

pySpark代码段中的正则表达式,正则表达式测试器中的正则表达式与Presto查询之间的区别是括号所在的位置。我已经玩过了,但是还没有解决问题...

编辑:我添加了整个功能以及另一个示例

0 个答案:

没有答案