我的string
格式为"12345-0012-0123"
,我想将它们全部更改为12345-0012-123"
格式,以便短划线后面的最后一个部分只有三位数而不是四位数。
在所有情况下,破折号之后的最后一个部分最多只能有三个真实数字,我需要保持前面的零,0001,0012,0123 ......
我将要编辑的一些字符串已经是正确的格式,所以快速检查一下,看看iI是否需要执行校正会更好......
编辑:解决了...... !!对于任何感兴趣的人,这是我正在使用的弧形gis计算器代码,该代码是根据anirudh提供的答案修改的...
#Convert to three digit count
def FixCount(s):
length = len(s[s.rfind('-')+1:])
if length > 3:
return s.rstrip(s[s.rfind('-')+1:])+s[s.rfind('-')+2:]
else:
return s.rstrip(s[s.rfind('-')+1:])+s[s.rfind('-')+1:]
__esri_field_calculator_splitter__
FixCount(str( !input_field_id! ))
答案 0 :(得分:4)
这是regular expressions的工作!
假设:
>>> s
'12345-0012-0123'
我们希望匹配两个三个组:
+
)个数字(d
)后跟一个-
,后跟一个或多个(+
)个数字(d
),然后按通过-
+
)0
,我们没有捕获(没有()
s)。如果您只想匹配单个+
,请删除0
。+
)个数字(d
)然后我们想要将s
替换为>>> re.sub('(\d+-\d+-)0+(\d+)', r'\1\2', s)
'12345-0012-123'
字符串s
,使其与此正则表达式匹配re.sub()
中的内容。
{{1}}
capture groups 返回修改后的{{1}},它不会就地修改它。
答案 1 :(得分:4)
这不一定是正则表达式的工作!
def reformat(a):
x = a.split("-")
x[-1] = "%03d"%int(x[-1])
return "-".join(x)
使用示例:
In [14]: reformat("12345-0012-0001")
Out[14]: '12345-0012-001'
所以在这里采取其他一些答案:
In [55]: %timeit v[:len(v)-4]+str(int(v.split('-')[2]))
100000 loops, best of 3: 1.83 us per loop
In [56]: %timeit reformat(v)
100000 loops, best of 3: 1.99 us per loop
In [57]: %timeit re.sub('(\d+-\d+-)0+(\d+)', r'\1\2', x)
100000 loops, best of 3: 9.53 us per loop
正则表达式在这里过于苛刻,与使用内置函数相比速度很慢。
答案 2 :(得分:2)
您可以使用johnsyweb所说的正则表达式,或者如果您不想使用正则表达式,也可以使用以下内容。
s = "12345-0012-0123"
length = len(s[s.rfind('-')+1:])
if length > 3:
print s.rstrip(s[s.rfind('-')+1:])+s[s.rfind('-')+2:]
else:
print s.rstrip(s[s.rfind('-')+1:])+s[s.rfind('-')+1:]
答案 3 :(得分:0)
其中v是字符串变量:
ONE LINER:
v=v[:len(v)-4]+str(int(v.split('-')[2]))
答案 4 :(得分:-2)
如果格式是固定的。只需这样做。
s[:11] + s[12:]
编辑:
这是更可靠的版本。
s[:11] + str(int[11:]))