我正在尝试通过以下正则表达式代码创建人员列表:
list_of_electricians = re.findall(r'\d*\.<(\d*)<([\w+ ]*)<"([^"]*)"<"([^"]*)"', csvFile1.read(), re.S)
csvFile2 = open(r'C:\\Users\\Admin\\SkyDrive\\eCommerce\\Servi-fied\\Raw Data\\EMA - Electricians (ReProcessed).csv', 'w+')
writer2 = csv.writer(csvFile2, delimiter=';')
for item in list_of_electricians:
writer2.writerow(item)
我想要提取的数据在字符串中如下:
1.<7059184<ABDUL HALIM M<"ABDUL HALIM M
639 #24-98
ROWELL ROAD
200639"<"62971924(Tel)
93632009(Hp)"
2.<7055147<ABDULLAH SUNNY BIN ALI<"SINGAPORE MRT LTD
251
NORTH BRIDGE ROAD
179102"<"65476617(Tel)
96814905(Hp)"
3.<7063254<ANG CHUI POH<"AKP INDUSTRIES PTE LTD
8B #05-08
ADMIRALTY STREET
757440"<"64811528(Tel)
93890779(Hp)"
有关如何更改正则表达式代码以便忽略所有换行符的任何建议?我知道我可以删除所有&#34; \ n&#34;或运行正则表达式之前的换行符。但是,我稍后需要这些行,以便更容易处理地址。
在一天结束时,我正在创建一个csv文件,其中的数据分为许可证号,姓名,地址和电话号码。
谢谢!
答案 0 :(得分:1)
你的正则表达对我来说很难解析,所以忍受我。在这种情况下,我甚至可能尝试使用所选分隔符进行字符串拆分,因为它非常复杂
对于此类事情非常有帮助的一个工具是http://pythex.org
无论如何,在“魔法修复它周围添加[]。不要问我原因。
\d*\.<(\d*)<([\w+ ]*)<"([^"]*)["]<"([^"]*)"
/\
here
答案 1 :(得分:0)
您拥有的代码应该为您提供一系列可以迭代的元组。
这意味着您的变量list_of_electricians
将具有以下内容:
[('1',
'7059184',
'ABDUL HALIM M',
"ABDUL HALIM M 639 #24-98 ROWELL ROAD 200639"),
('2',
'7055147',
'ABDULLAH SUNNY BIN ALI',
"SINGAPORE MRT LTD 251 NORTH BRIDGE ROAD 179102"]
您可以使用典型的for loop
进行迭代希望有所帮助
答案 2 :(得分:0)
为什么不使用csv.reader
并完全避免使用正则表达式?:
>>> infile = StringIO(data)
>>> rdr = csv.reader(infile, delimiter="<")
>>> for row in rdr: print(row)
['1.', '7059184', 'ABDUL HALIM M', 'ABDUL HALIM M\n 639 #24-98\n ROWELL ROAD\n 200639', '62971924(Tel)\n 93632009(Hp)']
[]
['2.', '7055147', 'ABDULLAH SUNNY BIN ALI', 'SINGAPORE MRT LTD\n 251\n NORTH BRIDGE ROAD\n 179102', '65476617(Tel)\n 96814905(Hp)']
[]
['3.', '7063254', 'ANG CHUI POH', 'AKP INDUSTRIES PTE LTD\n 8B #05-08\n ADMIRALTY STREET\n 757440', '64811528(Tel)\n 93890779(Hp)']
>>>
答案 3 :(得分:0)
正则表达式有点过于复杂。这使用更简单的正则表达式并保持行长度少于80个字符(PEP 8):
list_of_electricians = \
re.findall(r'.*?<(.*?)<(.*?)<"(.*?)"<"(.*?)"', csvFile1.read(), re.S)
以上仍将捕获换行符和多个空格。摆脱它们的一种方法是在事实之后重建列表:
for i,x in enumerate(list_of_electricians) :
list_of_electricians[i] = [' '.join(y.split()) for y in x]
摆脱它们的另一种方法是使用列表推导,以便从一开始就消除它们:
list_of_electricians = \
[[' '.join(x.split()) for x in y] \
for y in \
re.findall(r'.*?<(.*?)<(.*?)<"(.*?)"<"(.*?)"', csvFile1.read(), re.S)]