繁体   English   中英

python re.sub单个或多个字符

[英]python re.sub single or multiple characters

我有很多形式的弦

100XX 123XX 1XX 234XXXXX ,我想将所有X替换为0 字符串中还有地址形式的其他文本。

234XX N. Somestreet Anytown, USA我不确定在后面的数字是否不会出现在其他任何地方,所以我不能只替换X

到目前为止,我已经有了这段代码,但它只删除了一个0而我需要将其删除为可变数量的0。

re.sub(r"([0-9]+)([X]+)", r"\\g<1>0", "234XX")

这将给我2340 ...我需要它返回23400或如果给定123XXX我需要它返回123000

您可以使用回调函数获得所需的结果,请参见http://ideone.com/ccB37k

import re

def repl(m):
    return (m.group(1) + m.group(2).replace('X','0'))

str = '234XX N. Somestreet Anytown, USA'
pattern = r'\b(\d+)(X+)\b'
print(re.sub(pattern, repl, str))

我要做的是使用finditer返回正则表达式的MatchObjects ,然后可以访问诸如start()end()类的函数来重建字符串。 由于这是直接替换,因此您可以就地执行此操作而不必担心索引问题。

import re

res = '234XX N. Somestreet Anytown, USA\n234XXXXXX N. Somestreet Anytown, USA\nXXXXXXXXXX'

for match in re.finditer(r"([0-9]+)([X]+)", res):
    print(match.group(1))
    print(len(match.group(2)))
    # res = res[:match.end(1)] + ('0' * len(match.group(2))) + res[match.end():]
    res = res[:match.end(1)] + match.group(2).replace('X','0') + res[match.end():]

print(res)

我最终要做的是创建一个可调用的并将其传递给re.sub

def sub_0_for_x(match):
    old = match.groups()
    return old[0] + "0" * len(match[1])

re.sub("([0-9]+)([0]+)", sub_0_for_x, "123XX Anyplace, USA")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM