【发布时间】:2016-12-15 09:37:22
【问题描述】:
我正在尝试解析两种类型的单行地址字符串:
Flat XXX, XXX <Building name>, <City/town>, <State> <Postcode>
DDD <Generic place name>, <Road name> road, <City/town>, <State>
使用以下正则表达式
re.search(r'(Flat \w+)?\W*(.+)\W*([a-zA-Z]{1,2}\d+\s+\d+[a-zA-Z]{1,2})?
这里XXX 是一些字母数字字符串,DDD 是一个数字。如果地址属于第一种类型,我希望第 1 组为Flat XXX,否则为None,如果地址属于第一种类型,则第 2 组为XXX <Building name>, <City/town>, <State>,如果属于第二种类型,我希望第 2 组为<Road name> road, <City/town>, <State>类型,如果地址属于第一种类型,则第 3 组为邮政编码,否则为None。邮政编码是一个英国邮政编码,我的正则表达式(不完全准确,但对我的目的来说大部分是正确的)是[a-zA-Z]{1,2}\d+\s+\d+[a-zA-Z]{1,2}。忽略大小写,Flat XXX(如果存在)和<Building name>之间可能没有逗号,城市和邮政编码之间可能有逗号(如果存在)。
>>> address1 = 'Flat 29, Victoria House, Redwood Lane, Richmond, London SW14 9XY'
>>> re.search(r'(Flat \w+)?\W*(.+)\W*([a-zA-Z]{1,2}\d+\s+\d+[a-zA-Z]{1,2})?', address1, re.I).groups()
>>> ('Flat 29', 'Victoria House, Redwood Lane, Richmond, London SW14 9XY', None)
>>> address2 = '91 Fleet, Major Road, Fleet, Hampshire'
>>> re.search(r'(Flat \w+)?\W*(.+)\W*([a-zA-Z]{1,2}\d+\s+\d+[a-zA-Z]{1,2})?', address2, re.I).groups()
>>> (None, '91 Fleet, Major Road, Fleet, Hampshire', None)
我不确定出了什么问题,但我认为中间群体..\W*(.+)\W*.. 或多或少地捕捉到了一切。
【问题讨论】:
-
您最终需要从地址中获得什么?
-
你有没有考虑并尝试过非贪婪版本:
..\W*(.+?)\W*..? -
我描述了我需要的内容:如果地址属于第一种类型,我希望第 1 组为
Flat XXX,如果不是,则第 2 组为XXX <Building name>, <City/town>, <State>,如果地址为第一种类型,如果是第二种类型,则为<Road name> road, <City/town>, <State>,如果地址属于第一种类型,则第3组为邮政编码,否则为None。 -
非贪婪版本为我提供
('Flat 29', 'V', None)第一种地址,例如对于address1 = Flat 29, Victoria House, Redwood Lane, Richmond, London SW14 9XY。
标签: python regex python-2.7 python-3.x pattern-matching