[英]Python (Regex): How do you get Python to ignore all the newlines in between the string pattern you are trying match?
我正在尝试通过以下正则表达式代码创建人员列表:
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)"
关于如何更改正则表达式代码,以便忽略所有换行符的任何建议? 我知道我可以在运行正则表达式之前删除所有“ \\ n”或换行符。 但是,稍后我需要这些行,以便更轻松地处理地址。
归根结底,我正在考虑创建一个csv文件,其数据分为许可证号,名称,地址和电话号码。
谢谢!
您的正则表达式对我的大脑来说很难解析,所以请耐心等待。 在这种情况下,我什至可以尝试将字符串拆分与选定的分隔符一起使用,因为它非常复杂
http://pythex.org就是其中一种非常有用的工具
无论如何,在“周围加上[]可以神奇地解决它。不要问我为什么。
\d*\.<(\d*)<([\w+ ]*)<"([^"]*)["]<"([^"]*)"
/\
here
您拥有的代码应为您提供一个可以迭代的元组数组。
这意味着您的变量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循环进行迭代
希望能有所帮助
为什么不只使用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)']
>>>
该正则表达式有点过于复杂。 这使用了更简单的正则表达式,并使行的长度少于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)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.