使用正则表达式在Python中将'nnn0n'替换为'nnn1n'

时间:2011-06-10 11:21:56

标签: python regex

我想将'nnn0n'形式的字符串替换为'nnn1n'形式的字符串,其中n是任意数字。最简单的方法是什么?所以,我尝试了以下几点:

int(re.sub(r'^(\d+?)(0)(\d)$', r'\1???\3', '7001')) 

但我代替'???'只是1\1的内容会返回错误的结果。

有什么想法吗?

修改

我想出了一个丑陋的版本:

re.sub(r'a1a', '1', re.sub(r'^(\d+?)(0)(\d)$', r'\1a1a\3', '7001'))

还有什么更好的吗?

6 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

re.sub(r'^(\d{3})0(\d)$', r'\g<1>1\2', '7001')

或者,如果在你想要替换的0之前并不总是三个数字:

re.sub(r'^(\d+)0(\d)$', r'\g<1>1\2', '1234509')

修改如果您知道该号码的格式始终相同,则可以使用:

re.sub(r'0(?=\d$)', '1', '7001')

答案 1 :(得分:3)

你真的不需要正则表达式。

replace = lambda x: '{0}1{1}'.format(x[:-2], x[-1]) if x[-2] == '0' else x
# or: x[:-2] + '1' + x[-1]
print replace('12345678901')

答案 2 :(得分:1)

您可以使用命名组来解决此问题

int(re.sub(r'^(?P<prefix>\d+?)0(\d)$', r'\g<prefix>1\2', '7001'))

但最自然的方法可能是

int(re.sub(r'0(\d)$', r'1\1', '7001'))

答案 3 :(得分:1)

>>> r = re.compile(r'(\d{3})0(\d)')
>>> r.sub('\g<1>1\g<2>', '88808')
88818

答案 4 :(得分:1)

另一个没有正则表达式的“非辉煌”解决方案 - 但我必须至少为自己尝试:

data = ['7001', '700001', '701', '71', '12345']
res = (int(x)+10 if len(x) > 2 and x[-2] == '0' else int(x) for x in a )
print list(res)

答案 5 :(得分:1)

这是一个数字解决方案:

def addTenNumeric(n):
  """Add 10 to n if, as decimal, the 2nd least significant digit of n is 0"""
  if (n % 100) < 10:
    return n + 10
  return n

这应该比在字符串表示上使用正则表达式快得多。