【问题标题】:How to make Regex ignore a pattern following a specific group如何使正则表达式忽略特定组之后的模式
【发布时间】:2015-01-30 01:01:07
【问题描述】:

我确实在 2 个月前发布了 this question,并获得了以下 REGEX 模式来捕获 ICD9 代码。预期仅捕获 ICD9 代码(例如:134.57 或 V23.54 或 E33.62)并忽略患者体重 134.57 磅或实验室结果(如 127.20 mg/dL)。

icdRegex = recomp('(V\d{2}\.\d{1,2}|\d{3}\.\d{1,2}|E\d{3}\.\d)(?!\s*(?:kg|lb|mg)s?)')

现在出现了异常。 regex 的第二部分不会忽略后跟 kg、lb、mg 或任何其他停用词的模式。

我可以编写一些基本的正则表达式,但这对我的小脑袋来说有点太复杂了,需要帮助。

【问题讨论】:

  • 您可以发布示例输入数据以及您想要捕获的内容吗?什么语言?
  • 它是 Python。样本数据类似于 //2 型糖尿病 (250.00) (E11.9)高血压 (401.9) (I10) 高脂血症 (272.4) (E78.5) 骨质减少 (733.90) (M85.80) 维生素 D 缺乏症 (268.9 ) (E55.9) 重量 272.4 磅 Testestore 250.0//
  • 每条记录都会有// 分隔符吗? ICD9 代码总是在括号中吗?您越具体,您的解决方案就越稳健。
  • 否,分隔符仅用于标记帖子中示例数据的边界。是的,ICD9 代码将始终在括号中。

标签: python regex


【解决方案1】:
(?:(?:V\d{1,2}\.\d{1,2})|(?:\d{1,3}\.\d{1,2})|(?:E\d{1,2}\.\d+))(?!\d|(?:\s*(?:kg|lb|mg)s?))

试试这个。查看演示。

https://regex101.com/r/pM9yO9/12

modified the lookahead to include \d in it so that partial matches are avoided

x="""134.57 or V23.54 or E33.62 134.57 lb or a lab result like 127.20 mg/dL"""
print re.findall(r"(?:(?:V\d{1,2}\.\d{1,2})|(?:\d{3}\.\d{1,2})|(?:E\d{1,2}\.\d+))(?!\d|(?:\s*(?:kg|lb|mg)s?))",x)

输出:['134.57', 'V23.54', 'E33.62']

根据数据测试的最终版本。

icdRegex = recomp("(?:(?:V\d{1,2}.\d{1,2})|(?:\d{3}.\d{1,2})| (?:E\d{1,2}.\d+))(?!\d|(?:\s*(?:kg|lb|mg)s?))") 代码 = findall(icdRegex, 命中)

“击中”将是临床记录。

【讨论】:

  • 你做了什么改变,为什么?
  • 我觉得我问这个问题做得不好。我的正则表达式捕获 ICD9 代码的第一部分运行良好,经过良好测试。问题是它还捕获了像 134.56 lb 这样的重量作为代码,因为它与模式匹配。 @vks:这个表达式捕获的不仅仅是 ICD9 模式(例如:2.5、44.52,这不是我们想要的)。我需要帮助来修复第二部分并使其忽略停用词后面的值。希望我说得通。
  • 它仍然遗漏了第一个 134.57。 ICD9 代码可以与某人的体重具有相同的值。我们押注正则表达式来识别第一个 134.57 是代码,第二个 134.57 是重量,因为它后面是 lb。
  • @vks:它在正则表达式测试器中有效,但在我的代码中无效。 python 的正则表达式有什么不同吗?
  • @vks :不,什么...你是对的。您的正则表达式模式工作得很好。它对我不起作用的原因是我将整个临床文档分成单独的行。当我改变我的流程以在整个文档上运行正则表达式时,它就像魅力一样。谢谢一吨。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多