正则表达式在多行中具有负向前瞻性

时间:2013-09-24 11:10:14

标签: regex parsing lookahead

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

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

你能告诉我我做错了吗?

2 个答案:

答案 0 :(得分:4)

我会这样做:

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

here on Regexr

如果((?![\r\n]+\w)[0-9a-zA-Z, \r\n\t])+没有关注,则[0-9a-zA-Z, \r\n\t]是我要说的重要部分,与(?![\r\n]+\w)中的下一个字符匹配。这符合您的期望。

在两种情况下,正则表达式都会因为字符类中未包含的字符而停止匹配。如果您希望采用与lazy quantifierpositive lookahead合并所需的方式:

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

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

here at Regexr

答案 1 :(得分:1)

正则表达式的问题在于+是贪婪的,直到找到该组中的字符,第一种情况为@,第二种情况为-。< / p>

另一种方法是使用非贪婪的量词和积极的预测,换行后跟一个单词字符,如(版本):

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']