如何在re.sub中添加通配符并删除_之前的所有字符

时间:2013-05-06 21:19:06

标签: python regex python-2.7

我有以下代码

    infile = botslib.opendata(ta_from.filename,'r')
    tofile = botslib.opendata(str(ta_to.idta),'wb')
    start = infile.readline()
    import textwrap
    import re
    lines= "\r\n".join(textwrap.wrap(start, 640))
    for line in lines:
        re.sub('^\...[_]*', '',line)
        tofile.write(line.split('_')[-1])
    infile.close()
    tofile.close()

输入

Ichg_UNBUNOA3 14 2090100000015 14 1304221445000001

现在的输出是 IchgUNBUNOA3 14 2090100000015 14 1304221445000001

但我希望它是 UNBUNOA3 14 2090100000015 14 1304221445000001

ichg也可以是grp1 grp12

我做错了什么?

2 个答案:

答案 0 :(得分:0)

试试这个:

print re.sub('^[^_]*_', '', 'Ichg_UNBUNOA3 14 2090100000015 14 1304221445000001')

说明:

^ begin of the line
[^_]* all characters that are not underscore 0 or more time
_ underscore

你必须在分裂(我认为最好的方式)或正则表达式(你已经写完两个!)之间做出选择。

for line in lines:
    tofile.write(line.split('_')[-1])

for line in lines:
    tofile.write(re.sub('^[^_]*_', '', line))

答案 1 :(得分:0)

主要问题是你的lines变量实际上并不是一个行列表 - 它是一个包含连接在一起的包裹行的单个字符串。因此,您一次循环字符串一个字符,而不是一次处理一行。

你需要摆脱围绕textwrap调用的"\r\n".join调用,你应该按照预期在列表中包含这些行。

至于正则表达式:除了错误之外,该代码没有用处,因为你从未真正将re.sub调用的结果分配给任何东西。但是无论如何都不需要它,因为下面的split调用达到了同样的目的。

简而言之,您的代码应该看起来更像这样:

infile = botslib.opendata(ta_from.filename,'r')
tofile = botslib.opendata(str(ta_to.idta),'wb')
start = infile.readline()
import textwrap
lines= textwrap.wrap(start, 640)
for line in lines:
    tofile.write(line.split('_')[-1])
infile.close()
tofile.close()