5

在过去的几个小时里,我一直在尝试从以下示例数据中匹配地址,但我无法让它工作:

medicalHistory      None
address             24 Lewin Street, KUBURA, 
                NSW, Australia
email               MaryBeor@spambob.com


address             16 Yarra Street, 
                                     LAWRENCE, VIC, Australia
name                Mary   Beor
medicalHistory      None
phone               00000000000000000000353336907
birthday            26-11-1972

我的计划是找到以“地址”开头的任何内容,后跟任何空格,后跟字符、数字逗号和换行符,并以换行符后跟一个字符结尾。我想出了以下(以及它的许多变体):

address\s+([0-9a-zA-Z, \n\t]+)(?!\n\w)

不幸的是,它符合以下条件:

address             24 Lewin Street, KUBURA,
                NSW, Australia
email               MaryBeor  

address             16 Yarra Street,
                                 LAWRENCE, VIC, Australia
name                Mary   Beor
medicalHistory      None
phone               00000000000000000000353336907
birthday            26

代替

address             24 Lewin Street, KUBURA, 
                NSW, Australia

address             16 Yarra Street,
                                 LAWRENCE, VIC, Australia

你能告诉我我做错了什么吗?

4

2 回答 2

5

我会这样做:

address\s+((?![\r\n]+\w)[0-9a-zA-Z, \r\n\t])+

在 Regexr 上查看。

((?![\r\n]+\w)[0-9a-zA-Z, \r\n\t])+是重要的部分,我说,[0-9a-zA-Z, \r\n\t]如果(?![\r\n]+\w)没有跟随,匹配来自 的下一个字符。这符合您的预期。

在您的两种情况下,正则表达式都停止匹配,因为您的字符类中不包含一个字符。如果您想这样做,则需要结合惰性量词积极的前瞻

address\s+([0-9a-zA-Z, \n\r\t]+?)(?=\r\w)

[0-9a-zA-Z, \n\r\t]+?匹配尽可能少,直到条件(?=\r\w)为真。

在 Regexr 上查看

于 2013-09-24T11:23:38.800 回答
1

您的正则表达式的问题在于它+是贪婪的,直到它从该组中找到一个字符,@在第一种情况下和-在第二种情况下。

另一种方法是使用非贪婪量词和正向前瞻换行符,后跟单词字符,例如(版本):

re.findall(r'address\s+.*?(?=\n\w)', s, re.DOTALL)

它产生:

['address             24 Lewin Street, KUBURA, \n                NSW, Australia',
 'address             16 Yarra Street, \n                                     LAWRENCE, VIC, Australia']
于 2013-09-24T11:33:47.310 回答