1

对不起,如果这是一个初学者的问题,但我对 python 没有太多经验,并且真的可以使用一些帮助来解决这个问题。如果有更好的编程语言来解决这个问题,我会更愿意听到它

我正在做一个小项目,我有两个数据块,格式彼此不同。它们都是保存为 CSV 文件的电子表格,我真的很想让一组匹配另一组,而不必手动编辑所有数据。

我需要做的是通过 CSV,并像这样格式化保存的任何数据:

10W

20E

15-16N

17-18S

像这样的格式(相应格式的相应行):

10,瓦

20,乙

,,15,16,N

,,17,18,S

这样它们就可以在作为电子表格打开时被复制

我能够将文件转换为 python 中的字符串,但我不确定如何正确编写一些东西来搜索数字-连字符-数字-字母格式。

我将非常感谢我能得到的任何帮助。谢谢

4

3 回答 3

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'
于 2012-06-01T20:05:49.773 回答
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)
于 2012-06-01T20:15:13.890 回答
0

就您而言,我认为快速解决方案将涉及正则表达式

您可以使用match方法在它们与给定的正则表达式匹配时提取不同的标记,或者使用split方法将字符串拆分为给定分隔符的标记。

但是,在您的情况下,分隔符将是单个字符,因此您可以使用类中的split方法str

于 2012-06-01T20:03:52.517 回答