抱歉,如果这是一个初学者的问题,但我没有太多的python经验,并且可以真正使用一些帮助来搞清楚这一点。如果有更好的编程语言来解决这个问题,我会非常乐意听到它
我正在开发一个小项目,我有两个数据块,格式不同。它们都是保存为CSV文件的电子表格,我真的想让一个组匹配另一个组而不必手动编辑所有数据。
我需要做的是浏览CSV,并格式化保存的所有数据:
10W
20E
15-16N
17-18S
使用这样的格式(相应格式的各行):
10,W
20,E
,, 15,16,N
,, 17,18,S
这样当它们作为电子表格打开时,它们就可以被复制了
我能够在python中将文件转换为字符串,但我不确定如何正确编写某些内容来搜索数字连字符数字格式。
我非常感谢能得到的任何帮助。感谢
答案 0 :(得分:1)
这听起来像正则表达式的一个很好的用例。一旦你将这些行拆分成单个字符串并剥离空格(使用s.strip()
),这些应该可行(我假设这些是基本方向;你需要将[NESW]
更改为其他内容如果那个假设是不正确的。):
>>> import re
>>> re.findall('\A(\d+)([NESW])', '16N')
[('16', 'N')]
>>> re.findall('\A(\d+)([NESW])', '15-16N')
[]
>>> re.findall('\A(\d+)-(\d+)([NESW])', '15-16N')
[('15', '16', 'N')]
>>> re.findall('\A(\d+)-(\d+)([NESW])', '16N')
[]
第一个正则表达式'\A(\d+)([NESW])'
只匹配一个字符串,该字符串以数字序列开头,后跟大写字母N,E,S或W.第二个匹配仅跟随一系列数字开头的字符串用连字符,后跟另一个数字序列,后跟大写字母N,E,S或W.强制它在开头匹配,确保这些正则表达式与较长字符串的后缀不匹配。
然后你可以这样做:
>>> vals = re.findall('\A(\d+)([NESW])', '16N')[0]
>>> ','.join(vals)
'16,N'
>>> vals = re.findall('(\d+)-(\d+)([NESW])', '15-16N')[0]
>>> ',,' + ','.join(vals)
',,15,16,N'
答案 1 :(得分:1)
这是一个使用正则表达式的完整解决方案。 @senderle打败了我的答案,所以随时勾选他的回答。这只是在这里添加的,因为我知道在我的代码中首先将re
包裹起来是多么困难。
import re
dash = re.compile('(\d{2})-(\d{2})([WENS])')
no_dash = re.compile( '(\d{2})([WENS])' )
raw = '''10W
20E
15-16N
17-18S'''
lines = raw.split('\n')
data = []
for l in lines:
if '-' in l:
match = re.search(dash, l).groups()
data.append( ',,%s,%s,%s' % (match[0], match[1], match[2] ) )
else:
match = re.search(no_dash, l).groups()
data.append( '%s,%s' % (match[0], match[1] ) )
print '\n'.join(data)
答案 2 :(得分:0)