Python 正则表达式中的意外结果-我缺少什么?
我正在尝试提取此表单的免疫记录:Python 正则表达式中的意外结果-我缺少什么?,python,regex,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 Comm
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: 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*?]*?
会考虑这两种可能性(在疫苗名称和疫苗接种日期之间有其他字段…或没有…但这似乎没有起到作用。我的正则表达式有什么问题,以及我如何修复它?您可以使用:
import re
matches = re.findall(r"Immunization:\s+(.*?)\s+.*?Date Received:\s+(.*?)$", subject, re.IGNORECASE | re.DOTALL | re.MULTILINE)
|
正则表达式解释: 您可以使用:
import re
matches = re.findall(r"Immunization:\s+(.*?)\s+.*?Date Received:\s+(.*?)$", subject, re.IGNORECASE | re.DOTALL | re.MULTILINE)
|
正则表达式解释:
在pythex上使用多行和DOTALL测试了这一点: 输入 模式:
免疫:\s+(\w+).*?接收日期:\s+([^\n]+)
比赛1
在pythex上使用多行和DOTALL测试了这一点: 输入 模式:
免疫:\s+(\w+).*?接收日期:\s+([^\n]+)
比赛1
在[.\n]中的.in被视为文字“.”,而不是任何字符的符号。这就是为什么免疫接种后的日期行被接受,但您无法跳过不是换行符或点的字符
(.*\n)*
我想到的是以最接近您已有的方式帮助您解决问题。但是,有这么多嵌套*有点遗憾,因为这意味着解析记录需要很长的时间,作为一个人,我也发现这更难理解。可能最好在每个循环开始时都使用一个文本,以帮助您做出决策应完全输入/继续
如果我当时没有搞砸的话
Immunization:(.*?)(\n.*)*\nDate Received:(.*)\n
如果没有左递归,则只会在行的开头检测到“Date Received”。in[.\n]被视为文字“.”,而不是任何字符的符号。这就是为什么免疫接种后的日期行会被接受,但不能跳过不是换行符或点的字符
(.*\n)*
我想到的是以最接近您已有的方式帮助您解决问题。但是,有这么多嵌套*有点遗憾,因为这意味着解析记录需要很长的时间,作为一个人,我也发现这更难理解。可能最好在每个循环开始时都使用一个文本,以帮助您做出决策应完全输入/继续
如果我当时没有搞砸的话
Immunization:(.*?)(\n.*)*\nDate Received:(.*)\n
如果没有左递归,则“接收日期”只会在行的开头检测到。您使用的标志是什么?多行?您如何在
:
和strip spaces和*
处拆分行。您可以轻松地从数据生成字典。请尝试免疫:\s+(.+?)\n.*接收日期:\s+(.+?)\n
使用dotall标记时,您使用的是什么标记?多行?您如何在:
处拆分行,并在*
处拆分空格。您可以轻松地从数据生成字典。请尝试方法:\s+(.+?)\n.*接收日期:\s+(.+?)\n
带有dotall标志谢谢。你能解释一下为什么这样做吗?特别是,不包括任何关于换行符的内容是怎么回事吗?非常欢迎@randode。我已经用正则表达式解释更新了答案,在这种情况下,你应该使用re.dotall | re.MULTILINE
标志.GL!谢谢。你能解释一下吗为什么这样做?特别是,不包括任何关于新行的内容是怎么回事?非常欢迎@RandoDoe。我已经用正则表达式解释更新了答案,在这种情况下,你应该使用re.DOTALL | re.MULTILINE
flags.GL!