Python(Regex):你如何让Python忽略你尝试匹配的字符串模式之间的所有换行?

时间:2015-09-23 08:08:51

标签: python regex

我正在尝试通过以下正则表达式代码创建人员列表:

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文件,其中的数据分为许可证号,姓名,地址和电话号码。

谢谢!

4 个答案:

答案 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)]