【问题标题】:How to parse a number from line如何从行中解析一个数字
【发布时间】:2012-09-06 19:54:49
【问题描述】:

我有一个如下的文本文件,并且正在尝试创建一个新的文本文件。每个字符串都有一个带括号的数字。我需要一些关于如何解析这个数字的帮助。

test.txt

itemA (3)     
itemB (test) abcd (2)    
itemC xyx (3)

output.txt 文件创建为:

itemA-1  
itemA-2  
itemA-3  
itemB (test) abcd-1  
itemB (test) abcd-2  
itemC xyx-1  
itemC xyx-2   
itemC xyx-3

我当前的代码:

import os  
f = open('C:\\Dropbox\\test.txt','r')  
data = f.read()  
print (data)  
f.close()

【问题讨论】:

  • 要格式化stackoverflow的代码,只需将其逐字粘贴并按Ctrl+K。谢谢!

标签: python regex python-3.x


【解决方案1】:

使用正则表达式很简单:

r'\s*\((\d+)\)'

这将匹配(可选)空格,后跟括号中的数字,并将数字放在一个组中以便于替换:

parensnumber = re.compile(r'\s*\((\d+)\)')

count = int(parensnumber.search(line).group(1))
for i in range(count):
    print(parensnumber.sub('-{0}'.format(i + 1), line))

演示:

>>> import re
>>> parensnumber = re.compile(r'\s*\((\d+)\)')
>>> parensnumber.sub(r'-\1', 'itemA (3)')
'itemA-3'
>>> parensnumber.sub(r'-\1',  'itemB (test) abcd (2)')
'itemB (test) abcd-2'
>>> line = 'itemB (test) abcd (2)'
>>> count = int(parensnumber.search(line).group(1))
>>> for i in range(count):
...     print(parensnumber.sub('-{0}'.format(i + 1), line))
... 
itemB (test) abcd-1
itemB (test) abcd-2

您的具体示例的完整代码:

import os
import re

parensnumber = re.compile(r'\s*\((\d+)\)')

with open('C:\\Dropbox\\test.txt','r') as input:
    for line in input:
        count = int(parensnumber.search(line).group(1))
        for i in range(count):
            print(parensnumber.sub('-{0}'.format(i + 1), line))

【讨论】:

    【解决方案2】:

    试试这个:

    o = open('output.txt', 'w')
    for line in open('text.txt'):
        vals = line.split(' ')
        n = int(vals[-1][1:-1])
        for i in range(n):
            o.write("%s-%d" % (" ".join(vals[:-1]), i))
    o.close()
    

    只要您的输入正确。尽管您可能想考虑使用 REGEXP 而不是“手动”解析它。

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多