2017-07-12 28 views
0

有人帮助我得到这个权利。地址字段中的一些棘手模式。一些用户在街道名称字段中输入街道名称和郊区名称。需要清理它们。但清理变得棘手,因为这两个场景 -python - 正则表达式替换字符串中的单词列表

  1. 街道名称和郊区的名字是相同的,有时
  2. 多字的郊区名称与它们之间的空间。

示例: -

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

更新了我试过的问题。 –

回答

0

你可以试试这个正则表达式:

(.*)(point\s+c\w+)(.*)point\s+c\w+(.*)|(.+)\bpoint\s+c\w+(.*) 

并由:

替换10
\1\2\3\4\5\6 

Regex Demo

样品来源:(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) 

更新:

您应该建立一个字典,并应用上述正则表达式,并从你的字典里得到停止点转换......我认为这将对所有人更为可行和易于理解。所以你需要做的是在上面的正则表达式中将变量代替点\ s + c \ w +并从停用词词典中获取数据。

+0

谢谢,但它不仅点骑士,我有不同的郊区名称使用。因此,停词将会看起来像('西部泉','西部春','西部春天','西部spri','西部spr','西部sp','西部', ,'点chevalie', 'point chevali','point cheval','point cheva','point chev','point che','point ch','point c') –

+0

您应该构造一个字典,并应用上述正则表达式从你的字典停止点,并转换...我认为这将是更可行和所有人都可以理解。所以你需要做的是在上面的正则表达式中用变量代替点\ s + c \ w +,并把你的字典 –

0

我想在“开始”中搜索“C点”一条逻辑线。

import re 


string = ''' 
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 
''' 


def remove_if_suburb_name(data, suburb_startswith): 
    return re.sub(r'(?<!^) {}.*'.format(suburb_startswith), '', data, flags=re.MULTILINE) 


print(remove_if_suburb_name(data=string, suburb_startswith="Point C")) 

# Street_Name 
# Point Chevalier Road 
# Point Chevalier Road 
# Point Chevalier Road 
# Point Chevalier Road 
# Kings Road 
# Point Chevalier 

Regex101 demo

+0

的数据放在那里 - “Point Chevalier Road Point Che ma po che”和“Point Chevalier Road点Cheval“ –

+0

@ RizwanM.Tuman按预期工作。 [Regex101](https://regex101.com/r/jYaTnG/2) – BrightOne

+0

@ RizwanM.Tuman好吧,你是对的 - 在逻辑行开头使用空格,需要多行标志。编辑答案和[Regex101](https://regex101.com/r/jYaTnG/3) – BrightOne