使用多个分隔符/条件拆分列表的字符串元素。有好的Python库吗?

使用多个分隔符/条件拆分列表的字符串元素。有好的Python库吗?,python,regex,Python,Regex,我是Python新手,我一直在使用Google refine和Excel的组合清理一个混乱的数据库,但是,我认为Python可以做得更好,只要我能够得到一些可以重用的“配方” 我的问题的一个变体是数据库的“位置”字段不一致。大约95%的数据具有列表位置1中的格式,我能够用python以比使用Excel过滤器更高效的方式处理该格式。然而,我正在寻找一个python库或配方,它允许我处理数据库中所有类型的地理位置,可能是通过在列表中定义模式 提前感谢您的帮助 Location1=['Washingt

我是Python新手,我一直在使用Google refine和Excel的组合清理一个混乱的数据库,但是,我认为Python可以做得更好,只要我能够得到一些可以重用的“配方”

我的问题的一个变体是数据库的“位置”字段不一致。大约95%的数据具有列表位置1中的格式,我能够用python以比使用Excel过滤器更高效的方式处理该格式。然而,我正在寻找一个python库或配方,它允许我处理数据库中所有类型的地理位置,可能是通过在列表中定义模式

提前感谢您的帮助

Location1=['Washington, DC','Miami, FL','New York, NY']
Location2=['Kaslo/Nelson area (Canada), BC','Plymouth (UK/England)', 'Mexico, DF - outskirts-, (Mexico),']
Location3=['38.206471, -111.165271']

# This works for about 95% of the data, basically US addresses on Location1 type of List
CityList=[loc.split(',',1)[0] for loc in Location1]
StateList=[loc.split(',',1)[1] for loc in Location1]

我不确定你是否仍然对此有问题,但我相信这里有一个对你有用的答案:

#location_regexes.py
import re
paren_pattern = re.compile(r"([^(]+, )?([^(]+?),? \(([^)]+)\)")

def parse_city_state(locations_list):
    city_list = []
    state_list = []
    coordinate_pairs = []
    for location in locations_list:
        if '(' in location:
            r = re.match(paren_pattern, location)
            city_list.append(r.group(2))
            state_list.append(r.group(3))
        elif location[0].isdigit() or location[0] == '-':
            coordinate_pairs.append(location.split(', '))
        else:
            city_list.append(location.split(', ', 1)[0])
            state_list.append(location.split(', ', 1)[1])
    return city_list, state_list, coordinate_pairs

#to demonstrate output
if __name__ == "__main__":
    locations = ['Washington, DC', 'Miami, FL', 'New York, NY',
                'Kaslo/Nelson area (Canada), BC', 'Plymouth (UK/England)',
                'Mexico, DF - outskirts-, (Mexico),', '38.206471, -111.165271']

    for parse_group in parse_city_state(locations):
        print parse_group
输出:

$ python location_regexes.py 
['Washington', 'Miami', 'New York', 'Kaslo/Nelson area', 'Plymouth', 'DF - outskirts-']
['DC', 'FL', 'NY', 'Canada', 'UK/England', 'Mexico']
[['38.206471', '-111.165271']]

解决这个问题的一种方法可能是通过一个地理编码器运行每个条目,然后是一个反向地理编码器,它将为您提供结构化的结果。我建议两者都使用GeoNames:使用正则表达式将每个条目匹配到特定的格式,然后为每种情况编写代码。这是假设您可以使用可管理数量的单独表达式来处理大多数异常数据,也就是说,使用正则表达式,您可以捕获项目组。例如:表达式
“(\w+)\w*,\w*(\w{2})”
将匹配输入,例如
“Spokane,WA”
。对于正则表达式中的捕获组,
re
match对象将生成一个
groups()
,就像这样
(“Spokane”,“WA”)
。太棒了!非常感谢你!