在过去的几个小时里,我一直在尝试匹配以下示例数据中的地址,但我无法让它工作:
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
你能告诉我我做错了吗?
答案 0 :(得分:4)
我会这样做:
address\s+((?![\r\n]+\w)[0-9a-zA-Z, \r\n\t])+
如果((?![\r\n]+\w)[0-9a-zA-Z, \r\n\t])+
没有关注,则[0-9a-zA-Z, \r\n\t]
是我要说的重要部分,与(?![\r\n]+\w)
中的下一个字符匹配。这符合您的期望。
在两种情况下,正则表达式都会因为字符类中未包含的字符而停止匹配。如果您希望采用与lazy quantifier和positive lookahead合并所需的方式:
address\s+([0-9a-zA-Z, \n\r\t]+?)(?=\r\w)
[0-9a-zA-Z, \n\r\t]+?
匹配尽可能少,直到条件(?=\r\w)
为真。
答案 1 :(得分:1)
正则表达式的问题在于+
是贪婪的,直到找到该组中的字符,第一种情况为@
,第二种情况为-
。< / p>
另一种方法是使用非贪婪的量词和积极的预测,换行后跟一个单词字符,如(python版本):
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']