python - 正则表达式替换没有任何内容的字符串中的单词列表

时间:2017-07-12 04:10:32

标签: python regex python-2.7 pandas

有人帮助我做到了这一点。地址字段中的一些棘手模式。一些用户在街道名称字段中输入街道名称和郊区名称。需要清理它们。但由于两种情况,清理变得棘手 -

  1. 街道名称和郊区名称有时相同
  2. 多个单词的郊区名称,它们之间有空格。
  3. 示例: -

    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)
    

2 个答案:

答案 0 :(得分:0)

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

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

并替换为:

\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)

更新

你应该构建一个字典,并应用上面提到的正则表达式并从你的字典中获取停止点并转换...我认为这对所有人来说都更加可行和易懂。所以你需要做的是在上面的正则表达式中用变量代替point \ s + c \ w +并从你的停用词词典中获取数据

答案 1 :(得分:0)

我不会在逻辑行的开头搜索“Point c”。

x.info[13].prime_count

Regex101 demo