Python—如何从字符串中提取地址,或者如何在另一行的某个内容之前获取单词?

Python—如何从字符串中提取地址,或者如何在另一行的某个内容之前获取单词?,python,Python,我的样本内容如下 content =""" Dear Customer, Detail of service affected: Bobs Builders Retail park The Aavenue London LDN 4DX Start Time & Date: 04/01/2017 00:05 Completion Time & Date: 04/01/2017 06:00 Details of Work: .... 我已经把

我的样本内容如下

content ="""
Dear Customer,

 Detail of service affected: 

 Bobs Builders
 Retail park 
 The Aavenue
 London
 LDN 4DX


 Start Time & Date: 04/01/2017 00:05 
 Completion Time & Date: 04/01/2017 06:00 

 Details of Work: 
 ....
我已经把邮政编码拿出来了

postcodes =  re.findall(r"[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}", content)
我也想从这个内容中得到城市,这可能吗?我需要先给它提供一份城市的名单吗?然后检查一下

或者有没有办法在邮政编码前打电话?因为地址总是那样发送的

我可以使用邮政编码regex来获取邮政编码前的单词吗

谢谢这里有一个例子:

import re
postcodes =  re.findall(r"(\w+)\s+([A-Z]{3} \d[A-Z]{2})", content)

print postcodes
# => [('London', 'LDN 4DX')]
你可以得到两个组,第一个是在邮政编码前的单词(可能在另一行),第二个是邮政编码本身

为了使示例更具可读性,简化了邮政编码正则表达式

如果你想匹配任何英国代码,是一个很好的参考

顺便说一下,您提到的正则表达式与ldn4dx不匹配。为
[0-9R]
添加
可以:

postcodes =  re.findall(r"[A-Z]{1,2}[0-9R]?[0-9A-Z]? [0-9][A-Z]{2}", content)

有多种方法可以解决此问题:

1-使用谷歌API地理定位 如果可以通过进行模式匹配来提取地址部分,则可以将地址传递给,并让它为您解析地址

2-正则表达式搜索 如果您确定地址的格式始终正确,并且邮政编码始终位于城市名称之前,则可以使用正则表达式处理以下情况:

(\w*)\s+([A-Z]{3}\s+\d[A-Z]{2})
3-使用城市名称数据库 如果地址的格式不总是很好,那么最好使用城市名称数据库,例如

4-使用实体提取API[最佳]
这是自然语言处理中信息提取的经典应用。您可以使用实现自己的功能,或者更好地使用web服务,例如。将您的文本复制并粘贴到他们的文档中,看看自己的功能有多强大。

为什么不逐行解析您的内容?我该怎么做?如果每次的行号都不一样怎么办?你的内容的格式是否总是完全相同?在这种情况下,你可以阅读第8行的单词来获得城市。。。。或者,如果你总是在地址前加上“受影响的服务细节:”这句话,你可以在下一行写下…@AlexW,假设它是生成的内容(看起来像一封自动电子邮件),那么不管确切的内容是什么,它的结构肯定是相同的。如果您知道地址从“受影响的服务细节:”行之后的第一行非empy开始,那么解析地址块就很容易了。否则(如果它不是生成的内容,并且内容结构因案例而异),那么我真的帮不上忙。。。