我正在尝试提取此表格的免疫记录:
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*?]*?
会照顾两种可能性(疫苗接种名称和疫苗接种日期之间还有其他领域......或者不......但这似乎没有做到这一点。出了什么问题我的正则表达式以及我如何修复它?
答案 0 :(得分:0)
您可以使用:
import re
matches = re.findall(r"Immunization:\s+(.*?)\s+.*?Date Received:\s+(.*?)$", subject, re.IGNORECASE | re.DOTALL | re.MULTILINE)
答案 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]+)
答案 2 :(得分:0)
。在[。\ n]中,将其作为文字'。',而不是任何字符的符号。这就是接受免疫接种后的日期行的原因,但是你没有跳过不是换行符或点的字符。
(.*\n)*
会想到以最接近你已有的方式帮助你。然而,有这么多嵌套*有点不幸,因为这意味着解析记录需要长时间的呼吸,作为一个人类,我也发现它更难理解。如果要输入/继续循环,可能最好用文字开始每个循环以帮助决策。
如果我没有搞砸那么
Immunization:(.*?)(\n.*)*\nDate Received:(.*)\n
没有左递归和"收到日期"只会在行的开头检测到。