有人帮助我做到了这一点。地址字段中的一些棘手模式。一些用户在街道名称字段中输入街道名称和郊区名称。需要清理它们。但由于两种情况,清理变得棘手 -
示例: -
df1
Street_Name
Point Chevalier Road Point Che
Point Chevalier Road Point Ch
Point Chevalier Road Point Cheval
Point Chevalier Road Point Chevalier
Kings Road Point Chevalier
Point Chevalier
这里的逻辑是只删除第二个匹配的单词(如果有多个)。如果只有一个匹配,但前面有其他一些单词,则应该是"道路或街道名称+郊区名称",所以从中删除郊区名称。如果它只有字段中匹配的单词,请保持原样。
输出应该是,
Street_Name
Point Chevalier Road
Point Chevalier Road
Point Chevalier Road
Point Chevalier Road
Kings Road
Point Chevalier
我们可以在停用词列表中拥有郊区名称的所有可能性。像这样的东西,
stopwords = ['point c','point ch','point che','point chev','point cheva','point cheval','point chevali','point chevalie','point chevalier']
修改
这是我尝试过的,但它没有帮助:(
def remove_if_suburb_name(s):
stopwords = ('point c','point ch','point che','point chev','point cheva','point cheval',
'point chevali','point chevalie')
for word in stopwords:
m = re.sub(r'\b'+ word + r'\b','', s.lower(), count = 2)
return m
test['new_street_name'] = test['Street_Name'].apply(lambda x: remove_if_suburb_name(x) if pd.notnull(x) else x)
答案 0 :(得分:0)
你可以试试这个正则表达式:
(.*)(point\s+c\w+)(.*)point\s+c\w+(.*)|(.+)\bpoint\s+c\w+(.*)
并替换为:
\1\2\3\4\5\6
示例来源:(Run Here)
import re
regex = r"(.*)(point\s+c\w+)(.*)point\s+c\w+(.*)|(.+)\bpoint\s+c\w+(.*)"
test_str = ("Street_Name\n"
"Point Chevalier Road Point Cheva\n"
"Point chevalier Road Point Chev\n"
"Point Chevalier Road Point Cheval\n"
"Point Chevalier Road Point Chevali\n"
"Kings Road Point Chevalier\n"
"Point Chevalier")
subst = "\\1\\2\\3\\4\\5\\6"
result = re.sub(regex, subst, test_str, 0, re.IGNORECASE | re.MULTILINE)
if result:
print (result)
更新
你应该构建一个字典,并应用上面提到的正则表达式并从你的字典中获取停止点并转换...我认为这对所有人来说都更加可行和易懂。所以你需要做的是在上面的正则表达式中用变量代替point \ s + c \ w +并从你的停用词词典中获取数据
答案 1 :(得分:0)