在不拆分多字名称的情况下解析文本文件

时间:2014-03-13 15:57:29

标签: python regex parsing text python-3.x

我正在尝试使用文本文件从xml获取数字输出并将其转换为名称,然后将其写入单独的文本文件。我的问题是,名称有时会有空格,我不知道如何处理这个问题。

程序在线访问几个txt和xml文件,其中项目由参考编号引用。它将这些文件中的信息与我设置的条件进行比较,然后将参考号添加到列表中。我想要做的是将此参考号转换为相关名称。我有一个带有引用号和名称的文本文件,并希望使用index()函数查找引用号,然后将关联的名称写入文本文件。我在解析它时遇到问题,以便我可以进行转换。我的问题是列表是这样写的:

number    name\n
14        apple\n
27        anjou pear\n
36        asian pear\n
7645      langsat\n

所以,如果我只使用.split(),我最终会将一些名称分开。我尝试用' \ n'替换数字和名称之间的空格。并将其拆分,但那也没有用。如果我用'替换空间,'并且分裂了我最终的名字,包括下一行数[' apple \ n15'],它将文本写为两行并且留下了我无法将其分割为白色的相同问题空间...

任何建议???

我现在已经按照建议的方式实现了Dict()函数,它的作用是ACCEPT,我仍然在名称的末尾有\ n ...

ttn = dict()
f=open('typeid2.txt', 'r')
    for line in f:
    number, name = line.split(None,1)
    ttn[number] = name

如果我致电ttn['14'],我会'apple\n'

2 个答案:

答案 0 :(得分:1)

您可以将re.findall()用于此目的。

input = "number    name\n14        apple\n27        anjou pear\n36        asian pear\n7645      langsat\n"
print re.findall("(\w+)\s+(.+)", input)

输出:

[('number', 'name'), ('14', 'apple'), ('27', 'anjou pear'), ('36', 'asian pear'), ('7645', 'langsat')]

答案 1 :(得分:1)

正则表达式非常强大且有用,但需要花费很多时间才能习惯使用它们。我会建议你坚持使用split来解决这个问题,它来自split,它描述了如何使用maxsplit值来限制分割数量。

Help on built-in function split:

split(...)
S.split([sep [,maxsplit]]) -> list of strings

Return a list of the words in the string S, using sep as the
delimiter string.  If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator and empty strings are removed
from the result.

因此,对于您的代码,假设您有一些要拆分的行

mytest = dict()
for each_line in data:
    number, name = line.split(None,1)
    mytest[number] = name

会返回类似这样的内容

  
    
      

mytest的           {' 27':' anjou pear',' 7645':' langsat',' number':' ;名称',' 36':'亚洲梨',' 14':' apple'}       要访问帮助,假设您有一些字符串mystring然后只需键入

    
  
help(mystring.split)

我的第一次尝试与此次尝试之间的区别是由于下面的评论。在我的第一次尝试中,名称值的前导空格被保留,但是,通过使用None,所有空格字符在第一次拆分时被删除,因此这更具体地符合您要查找的内容。