如何用python脚本删除前导两个整数?

时间:2014-11-11 15:41:14

标签: python regex

我有一个包含许多行的txt文件,其坐标格式如下:

0;32520010,00;5840530,00;1;22,45;0,16;0,01;0,16;295,46;

我需要从所有第一个坐标中删除前导“32” - 即制作32520010,00;进入520010,00;并将该行写入新文件,同时保留所有其他字符。 我一直在尝试使用以下python脚本,但当坐标变得超过10个字符时会出现问题。

for line in readf:
    p = re.compile(r"32(520000,00;)")        
    result =  p.sub('\g<1>',line)

我怎样才能使其变得更灵活,并考虑到坐标可能长于或短于10个字符的事实?

5 个答案:

答案 0 :(得分:2)

我认为这不是您需要regex的问题:

>>> line = "0;32520010,00;5840530,00;1;22,45;0,16;0,01;0,16;295,46;"
>>> subs = line.split(";")
>>> subs[1] = subs[1][2:]
>>> subs
['0', '520010,00', '5840530,00', '1', '22,45', '0,16', '0,01', '0,16', '295,46', '']
>>> ";".join(subs)
'0;520010,00;5840530,00;1;22,45;0,16;0,01;0,16;295,46;'

这种方法将不分青红皂白地删掉第一个和第二个;之间的两个第一个字符。它并不关心这些字符是什么,并且它不关心字符串的长度(字符串短于2将导致'')。

答案 1 :(得分:2)

line = "0;32520010,00;5840530,00;1;22,45;0,16;0,01;0,16;295,46;"

p = re.compile(r"32(\d+,\d+;)")        
result =  p.sub('\g<1>',line)
print(result)

使用\d+会给您一个或多个数字。这应该是你正在寻找的。

它将替换第一个坐标以32开头的所有实例并将其删除。

答案 2 :(得分:0)

您可以在re.sub

中使用前瞻断言
>>> import re
>>> x="0;32520010,00;5840530,00;1;22,45;0,16;0,01;0,16;295,46;"
>>> re.sub(r'32(?=520010)','',x)
'0;520010,00;5840530,00;1;22,45;0,16;0,01;0,16;295,46;'

正则表达式32(?=520010)会匹配任何32,后跟520010

如果您不确定32可能会有什么后面的内容,那将会非常有用

>>> re.sub(r'(?<=\d;)32','',x)
'0;520010,00;5840530,00;1;22,45;0,16;0,01;0,16;295,46;'

答案 3 :(得分:0)

如果您想使用re模块,以下工作:

import re

line = "0;32520010,00;5840530,00;1;22,45;0,16;0,01;0,16;295,46;"

m = re.match(r"^(\d+;)32(.+)", line)
result =  m.group(1) + m.group(2)
print(result)

正则表达式匹配分号后的第一个数字,然后是32,然后是其余的。除了32之外的所有东西都被分组捕获然后合并在一起。

答案 4 :(得分:0)

另一种替代方式,

>>> s = '0;32520010,00;5840530,00;1;22,45;0,16;0,01;0,16;295,46;'
>>> ';'.join(map((lambda x: x.replace('32','') if x.startswith('32') else x ), s.split(';')))
'0;520010,00;5840530,00;1;22,45;0,16;0,01;0,16;295,46;'