这是我的样本数据
78|Indonesia|Pamela|Reid|preid25@gravatar.com|147.3.67.193
Run Code Online (Sandbox Code Playgroud)
我希望得到结果
Indonesia
Run Code Online (Sandbox Code Playgroud)
目前我在字符串上使用split并访问该值.但我想用正则表达式.
需要注意的一些条件:数据可能为空数据不包含管道(|)
我想使用正则表达式而不是拆分,因为我认为正则表达式更有效.我希望它尽可能高效的原因是因为源文件是70gb.
编辑:
这是我将使用它的整个代码
def main(argv):
mylist = set();
input_file = open("test.txt", 'r')
for row in input_file:
rowsplit = row.split("|");
if rowsplit[1] !='':
if rowsplit[1] in mylist:
filename= "bby_"+rowsplit[1]+".dat";
existingFile=open(filename,'a')
existingFile.write(row);
existingFile.close()
else:
mylist.add(rowsplit[1])
filename= "bby_"+rowsplit[1]+".dat";
newFile = open(filename,'a')
newFile.write(row);
newFile.close();
else:
print "Empty"
print mylist
Run Code Online (Sandbox Code Playgroud)
我只是对我现在应该使用哪些答案感到困惑:(
我只是希望这段代码很快.而已.
以下是Python 3.4.3上有意义答案的表现:
In [4]: timeit.timeit('s.split("|", 2)[1]', 's = "78|Indonesia|Pamela|Reid|preid25@gravatar.com|147.3.67.193"')
Out[4]: 0.43930888699833304
In [10]: timeit.timeit('re.search(r"^[^a-zA-Z]*([a-zA-Z]+)", s).group(1)', 's = "78|Indonesia|Pamela|Reid|preid25@gravatar.com|147.3.67.193"; import re')
Out[10]: 1.234878903022036
In [16]: timeit.timeit('re.search("^\d*\|(\w+?)?\|", s).group(1)', 's = "78|Indonesia|Pamela|Reid|preid25@gravatar.com|147.3.67.193"; import re')
Out[16]: 1.8305770770530216
Run Code Online (Sandbox Code Playgroud)
如果没有管道:
In [24]: timeit.timeit('s.split("|", 2)[1] if "|" in s else None', 's = "78|Indonesia|Pamela|Reid|preid25@gravatar.com|147.3.67.193"')
Out[24]: 0.494665392965544
In [25]: timeit.timeit('s.split("|", 2)[1] if "|" in s else None', 's = ""')
Out[25]: 0.04492994397878647
Run Code Online (Sandbox Code Playgroud)