我一直在努力使正则表达式正常工作。经过大量谷歌搜索和与同事协商,它仍然没有按预期工作。
我有一组要捕获的目标词(请参见注释行中的术语示例),以及周围的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”会根据目标词而变化
以下是一些示例:
Type 2 diabetes mellitus with moderate nonproliferative diabetic retinopathy with macular edema, left eye Care Plan:
我希望它返回的内容:
'with macular edema, left eye Care Plan'
我得到的是什么
'left'
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查询之间的区别是括号所在的位置。我已经玩过了,但是还没有解决问题...