我有一个包含许多行的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个字符的事实?
答案 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+
会给您一个或多个数字。这应该是你正在寻找的。 p>
它将替换第一个坐标以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;'