正则表达式出乎意料的结果 - 我错过了什么?

时间:2017-05-23 23:44:21

标签: python regex

我正在尝试提取此表格的免疫记录:

Immunization: Tetanus
Other: Booster 
Method: Injection
Date Received: 07 Jan 2013

以及此形式:

Immunization:   TETANUS DIPTHERIA (TD-ADULT)
Date Received:  07 Dec 2012 @ 1155
Location:       PORTLAND (OR) VAMC
Reaction:*      None Reported
Comments:       1234567 

这是我的模式字符串:

"Immunization:(.*?)\n[.\n*?]*?Date Received:(.*?)\n"

这是识别第二种模式并提取疫苗接种名称和日期,但不是第一种模式。我认为[.\n*?]*?会照顾两种可能性(疫苗接种名称和疫苗接种日期之间还有其他领域......或者不......但这似乎没有做到这一点。出了什么问题我的正则表达式以及我如何修复它?

3 个答案:

答案 0 :(得分:0)

您可以使用:

import re
matches = re.findall(r"Immunization:\s+(.*?)\s+.*?Date Received:\s+(.*?)$", subject, re.IGNORECASE | re.DOTALL | re.MULTILINE)

Regex Demo | Python Demo

正则表达式说明: enter image description here

答案 1 :(得分:0)

使用MULTILINE和DOTALL在pythex上测试:

输入

Immunization: Tetanus
Other: Booster 
Method: Injection
Date Received: 07 Jan 2013

Immunization:   TETANUS DIPTHERIA (TD-ADULT)
Date Received:  07 Dec 2012 @ 1155
Location:       PORTLAND (OR) VAMC
Reaction:*      None Reported
Comments:       1234567

模式:Immunization:\s+(\w+).*?Date Received:\s+([^\n]+)

匹配1

  1. 破伤风
  2. 2013年1月7日
  3. 匹配2

    1. 破伤风
    2. 2012年12月7日@ 1155
    3. Pythex

      Pythex with different grouping

答案 2 :(得分:0)

。在[。\ n]中,将其作为文字'。',而不是任何字符的符号。这就是接受免疫接种后的日期行的原因,但是你没有跳过不是换行符或点的字符。

(.*\n)*会想到以最接近你已有的方式帮助你。然而,有这么多嵌套*有点不幸,因为这意味着解析记录需要长时间的呼吸,作为一个人类,我也发现它更难理解。如果要输入/继续循环,可能最好用文字开始每个循环以帮助决策。

如果我没有搞砸那么

Immunization:(.*?)(\n.*)*\nDate Received:(.*)\n

没有左递归和"收到日期"只会在行的开头检测到。