Excel:解析地址
问题描述:
我已经在泰国的餐馆网站上扫描了一些数据。我目前在地址栏中存在问题,因为在网站上当地址移到下一行时,刮板决定合并它并且不留任何空间。例如:Excel:解析地址
22/F, Dusit Thani Bangkok946 Rama 4 RoadBangkokThailand
1/F, Oakwood Residence113 Thonglor Soi 13BangkokThailand
G/F, Ocean Tower IISukhumvit Soi 21WattanaBangkokThailand
在第一条目我希望第k和9以及d和B之间的空间,等等等等的其他条目。
我目前使用BeautifulSoup刮从here的数据。如果任何人都可以帮我解决这个问题,或者更好的方法来刮去HTML,那么我都会接受。我宁愿不要手动修改280多个地址条目。
答
你的例子表明几种模式需要插入空格:
- 小字母后跟一个大写字母
- 小字母后跟数字
- 数字,后面接着大写字母
- (但是这最后可能有一个包含数字和字母的地址的问题)
这可以使用正则表达式在VBA中开发用户定义的函数来完成。
Option Explicit
Function SplitAddress(S As String) As String
Dim RE As Object
Const sPatNumberCap As String = "\d(?=[A-Z])"
Const sPatNonCapNumberOrCap As String = "[a-z](?=[A-Z0-9])"
Const sRepl As String = "$& "
Dim sTemp As String
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = True
.ignorecase = False
.Pattern = sPatNumberCap
sTemp = .Replace(S, sRepl)
.Pattern = sPatNonCapNumberOrCap
sTemp = .Replace(sTemp, sRepl)
End With
SplitAddress = sTemp
End Function
如果地址2A一些街道是一个问题,你也许能够改变.Pattern这取决于这些类型的字符串真正的样子。如果该空格是大写字母后面的非空白字符,则可以确保只插入该空格。
如:
Const sPatNumberCap As String = "\d(?=[A-Z]\S)"
但没有例子,很难推测。
+1
谢谢你。这就像一个魅力。我真的需要刷上我的正则表达式。 – dtrinh
第一部分,从数字中分离出一个字母,不会太棘手。下一个问题是“道路”与“曼谷”的分离。它总是*会变成“曼谷”吗?或者,您是否有我们可以使用的城市列表?我正在考虑将每个单元格放在一个字母旁边的数字中,在两者之间添加空格。然后,我们只需要知道哪些城市要添加空间,哪些国家(只是“泰国”,所以不是那个问题的重点)。 – BruceWayne
是的,我有一种感觉,那将是最难的部分。不幸的是,它还将其他城市放在那里,例如:Samutprakarn等。你会如何将这封信与数字分开? – dtrinh