正则表达式跨多行

3

我有一个文本文件,其中包含大量未结构化数据,我试图使用1个正则表达式提取名称和出生日期。目前遇到的难题是日期可能会在一行结束并在另一行继续,而re.DOTALL似乎无法工作。我想要的数据格式始终为:

姓氏,中间名(有时),名字,f. DD-MM-YYYY

这是我的正则表达式:

re.findall(r'\w+,*\sf\.\s\d\d-\d\d-\d\d\d\d', re.DOTALL):

以下内容不换行:

Smith, John,

f. 25-12-1990

或者只有下面的一部分:

Smith, John, f. 25-12-

1990

Smith, John, f. 25-

12-1990


也许可以通过将\r?\n(?![A-Z])的匹配替换为空字符串来清理数据。这将替换除大写字母(姓氏开头)后面的所有换行符。 (?![A-Z])是一个负向先行断言 - Cary Swoveland
1个回答

3
如果您想要所有选项与可能的换行日期匹配,您可以在所有字符之间重复零个或多个空白字符来达到这个目的。
注意,在您的模式中,您正在重复逗号 0+ 次,*而不是\s
使用re.DOTALL会使.匹配换行符,但在您的模式中,您没有使用点,只有一个文字上的点\.\s将匹配包括换行符在内的空格符。 在您的数据中,日期部分之间有多个换行符。 您还可以使用[\r\n]*来匹配之间的换行符。
\w+,\s*f\s*\.\s*\d\s*\d\s*-\s*\d\s*\d\s*-\s*\d\s*\d\s*\d\s*\d

如果断点仅在连字符后面:

正则表达式演示 | Python演示

\w+,\s*f\s*\.\s*\d\d-\s*\d\d-\s*\d\d\d\d

正则表达式演示 | Python演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接