我用Python做了很多业余的数据清理和清理工作,这比用Excel要快得多。但我觉得我做任何事都很辛苦。最大的痛苦是,我不知道如何安全地从列表索引或字符串索引中获取,而不会出现错误,也不知道如何在代码中一层接一层地使用不可读的try/except。你知道吗
下面是一个例子,我刚刚想出了清理城市/州组合Trulia配置文件url。有时它们不给出状态,但模式是相当标准化的。你知道吗
checkstr = 'http://www.trulia.com/profile/agent-name-agent-orlando-fl-24408364/'
state = ''
citystrs = re.findall('-agent-(.*)-\d', checkstr)[0:1]
print citystrs
for citystr in citystrs:
if '-' in citystr:
if len(citystr.split('-')[-1]) == 2:
state = citystr.split('-')[-1].upper().strip()
city = string.replace(citystr.upper(), state, '')
city = string.replace(city, '-', ' ').title().strip()
else:
city = string.replace(citystr, '-', ' ').title().strip()
else:
city = citystr.title().strip()
print city, state
我不需要多个“答案”,但我使用切片[0:1]和for
,因为每当模式不适合findall[0]时,我不希望错误停止我的代码(执行此操作约200万次)。你知道吗
我能得到一些关于pythonic(和高效的)方法的建议吗?你知道吗
编辑1:我没有寻找不合格的字符串。我希望足够安全,让它贯穿每一件事并“尽其所能”(即,更符合>;更少)
编辑2:这个例子遗漏了一个非常明显的细节:多个单词的城市有内部破折号('-')。例如agent-name-los-angeles-82348233/
re.search
而不是findall
会更清楚。你知道吗[0:1]
所建议的那样),请注意.*
是贪婪的。例如,从字符串-agent-orlando-fl-24408364-agent-orlando-fl-24408364
中,regex捕获orlando-fl-24408364-agent-orlando-fl
。改用.*?
。你知道吗rpartition
string方法在最后一次出现分隔符时进行拆分,并始终返回三个字符串,这使得处理角点情况更加容易。你知道吗建议代码:
为什么不用切片呢?你知道吗
使用timeit(数字=10000):
我会这样做:
如果需要多次使用该模式,可以使用
re.compile
一次性编译它我没有使用
.*
这是非常宽容的,并生成回溯,而是使用[^-]*
(所有这些都不是零次或多次破折号),在第一个破折号之前停止。你知道吗状态和前面的破折号位于可选组:
(?:-(?P<state>[^-]*))?
。因此,即使字符串没有状态部分,模式也会成功。你知道吗有了这个更改
re.findall
就不再需要了,您可以使用re.search
返回一个结果。请注意,如果您不确定字符串格式,则始终可以添加测试以检查是否存在匹配项。你知道吗为了使代码更具可读性,我使用命名的captures
(?P<name>...)
。因此,通过这种方式,您可以轻松地检索组的内容:m.group('name')
。但是,如果您想稍微提高速度,可以使用数字组(但这不是很重要)。你知道吗相关问题 更多 >
编程相关推荐