破折号后改变字符串的结尾

时间:2014-04-17 04:10:56

标签: python

我的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! ))

5 个答案:

答案 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}}

N.B:

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:]))