如何在python中将文本文件的字符串拆分为字符和数字

如何在python中将文本文件的字符串拆分为字符和数字,python,Python,我有一个包含如下字符串的文件: N1109 X62.729 Y23.764 Z231.442 A59.756 B9.231 N 1109 X 62.729 Y 23.764 Z 231.442 A 59.756 B 9.231 所以我想从这个文件中拆分字符和整数。输出应如下所示: N1109 X62.729 Y23.764 Z231.442 A59.756 B9.231 N 1109 X 62.729 Y 23.764 Z 231.442 A 59.756 B 9.231 这是一

我有一个包含如下字符串的文件:

N1109 X62.729 Y23.764 Z231.442 A59.756 B9.231
N 1109  X 62.729 Y 23.764 Z 231.442  A 59.756 B 9.231
所以我想从这个文件中拆分字符和整数。输出应如下所示:

N1109 X62.729 Y23.764 Z231.442 A59.756 B9.231
N 1109  X 62.729 Y 23.764 Z 231.442  A 59.756 B 9.231
这是一个文本文件。我不知道如何从文本文件中执行此操作

我为此编写的代码是:

import re
from sys import argv
script, filename = argv
f = open(filename,"r")
lines = f.readlines()
print lines
r = re.compile("([a-zA-Z]+)([0-9]+)")
a = [r.match(string).group() for string in lines]
print a
当我使用
group()
时,我遇到了以下错误:

`AttributeError: 'NoneType' object has no attribute 'group'`
当我删除
group()
时,输出是:

[,无,无,无,无,无,无,无,无,无]


请帮助我,我是python新手…

问题是
match
将只从开始搜索,然后停止:

如果字符串开头的零个或多个字符与 正则表达式模式,返回相应的MatchObject 例如

您需要使用
findall

>>> i
'N1109   X62.729   Y23.764   Z231.442   A59.756   B9.231'
>>> re.findall(r'(\w{1})(\d+\.?\d+)', i)
[('N', '1109'), ('X', '62.729'), ('Y', '23.764'), ('Z', '231.442'), ('A', '59.756'), ('B', '9.231')]

也可以考虑使用<>代码> 语句,它将处理对您的文件关闭:

import re
import sys

exp = r'(\w{1})(\d+\.?\d+)'

with open(sys.argv[1]) as f:
    for line in f:
        for letter,number in re.findall(exp, line):
            print('{} {}'.format(letter, number))

此外,您的原始表达式
“([a-zA-Z]+)([0-9]+)”
没有考虑数字的可选
部分-您的表达式是“一个或多个字母字符,不考虑大小写后跟一个或多个数字”,您需要的表达式是“一个或多个字母字符,后跟一个或多个数字,一个可选的
,然后是一个或多个数字”。

为此,您可以使用
re
模块

试试这个,这个可能对你有帮助

import re
>>> match = re.match(r"([a-z]+)([0-9]+)", 'N1109', re.I)
>>> if match:
        print match.groups()

Output:

('N', '1109')
更新

>>> a=['N1109', 'X62.729', 'Y23.764', 'Z231.442', 'A59.756', 'B9.231']
>>> answer=[]
>>> for i in a:
        match = re.match(r"([a-z]+)([0-9]*\.?[0-9]+)", i, re.I)
            if match:
                   answer.append(match.groups())


>>> answer
[('N', '1109'), ('X', '62.729'), ('Y', '23.764'), ('Z', '231.442'), ('A', '59.756'), ('B', '9.231')]
>>> 
更新
这很好,适用于特定的字符串。但是如何处理完整的文件。我只有文件名和位置。@user3125133您能提供文本文件示例吗?您有1100 X63.658 Y21.066 Z230.989 A60.28 B9.5 N1101 X63.424 Y21.419 Z231.06 A60.269 B9.459 N1102 X63.219 Y21.805 Z231.132 A60.231 B9.418 N1103 X63.051 Y22.206 Z26.6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 A.597 A59.316 B9.133 N1115 X62.734 Y25.167 Z231.627 A59.222 B9.114 N1123 X62.793 Y27.037 Z231.864 A58.46 B8.961