我想将'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'))
还有什么更好的吗?
答案 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
这应该比在字符串表示上使用正则表达式快得多。