【问题标题】:Fuzzy/ Wildccard matching of substring with string子字符串与字符串的模糊/通配符匹配
【发布时间】:2018-09-13 21:38:25
【问题描述】:

我得到了以下街道的列表

Fakestr. 1
Fakestr. 2
Fakestr. 3
.....
Fakestr. 11
Fakestr. 12
Fakestr. 13

还有一些其他的 20k。 (希望保持示例小)。

现在我得到了另一个文本文件,其中 Line 可以或不可以包含 Street 和 Housnumber 组合。

例如:

── Fakestreet_2-bla aha blatesttest\n
─ Fakestr._2-blablatesttest\n
Fakestreet 5_2017
── Fakestreet_2-jo-what
500000222 Fakestreet 13 .sdfs
Fakestreet_7
dsd Fakestreet 13 hae
500000 Fakestreet 12-14 d
Fakestreet 1 hey what 249

所以我尝试了使用 difflib(difflib.get_close_matches、SequenceMatcher)、wuzzyfuzzy 等不同的方法。 没有一个按预期工作。

到目前为止,我通过以下方式存档了最好的结果:

import re
matchobj = re.search('Fakestr(.*)12','─ Fakestr._2-blablatesttest\n') 
print(matchobj.group(0))
--> Result: Error. 
--> But thats ok.

matchobj = re.search('Fakestr(.*)2','── Fakestreet_2-bla aha blatesttest\n') 
print(matchobj.group(0))
--> Result:  Fakestreet 2 
--> Thats ok

matchobj = re.search('Fakestr(.*)5','Fakestreet 5_2017') 
print(matchobj.group(0))
--> Result: Fakestreet 5 
--> Thats ok

matchobj = re.search('Fakestr(.*)2','── Fakestreet_2-jo-what') 
print(matchobj.group(0))
--> Result: Fakestreet 2
--> Thats ok

matchobj = re.search('Fakestr(.*)7','── Fakestreet_7') 
print(matchobj.group(0))
--> Result: Fakestreet 7
--> Thats ok

matchobj = re.search('Fakestr(.*)5','500000 Fakestreet 1-5 .sdfs') 
print(matchobj.group(0))
--> Result: Fakestreet 1-5
-->That would be okay i can solve this cases later

matchobj = re.search('Fakestr(.*)5','dfsd Fakestreet 5,6 aaf') 
print(matchobj.group(0))
--> Result: Fakestreet 5 
-->Thats ok

matchobj = re.search('Fakestr(.*)6','500000222 Fakestreet 5,6 .sdfs') 
print(matchobj.group(0))
--> Result: Fakestreet 5,6 
-->Thats ok

matchobj = re.search('Fakestr(.*)14','Fakestreet 1  hey what 249') 
print(matchobj.group(0))
--> Result: Fakestreet 1 hey what 124
--> Thats wrong

matchobj = re.search('Fakestr(.*)1','500000222 Fakestreet 12-14 .sdfs') 
print(matchobj.group(0))
--> Result: Fakestreet 12-1 
--> Thats wrong

matchobj = re.search('Fakestr(.*)1','222 Fakestreet 13 .sdfs') 
print(matchobj.group(0))
--> Result: Fakestreet 1 
--> Thats wrong 

那么我该如何处理后面的三种情况呢?有(仅)一些限制:门牌号不能超过 3 个数字。门牌号码大多紧跟在街道名称之后。

【问题讨论】:

    标签: python search match fuzzy-search


    【解决方案1】:

    您似乎想将您的 .* 更改为 .*\d+.*[0-9_.,-]+,前提是您也允许使用除数字以外的其他字符。

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 2012-02-14
      • 2014-11-02
      • 2017-08-03
      • 2018-05-31
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多