Python正则表达式;替换部分比赛

发布于 2021-01-29 15:03:16

如何限制e004_n07中匹配/替换前导零?但是,如果任何一项包含全零,那么我需要在该项中保留一个零(请参见下面的示例)。对于输入字符串,第一个值将始终有3位数字,第二个值将始终有2位数字。

输入和输出示例

e004_n07 #e4_n7
e020_n50 #e20_n50
e000_n00 #e0_n0

是否可以单独使用re.sub完成此操作,还是需要使用re.search/re.match?

关注者
0
被浏览
55
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果只想在字母后删除零,则可以使用:

    ([a-zA-Z])0+
    

    替换为\1反向引用。请参阅regex演示

    ([a-zA-Z])将捕获了一封信,0+将匹配1个或多个零。

    Python演示

    import re
    s = 'e004_n07'
    res = re.sub(r'([a-zA-Z])0+', r'\1', s)
    print(res)
    

    请注意,这 re.sub
    将查找并替换所有不重叠的匹配项(将执行全​​局搜索并替换)。如果不匹配,则将按原样返回字符串,而无需进行修改。因此,无需使用额外的re.match/
    re.search

    UDPATE

    要保留1个零(如果数字仅包含零),可以使用

    import re
    s = ['e004_n07','e000_n00']
    res = [re.sub(r'(?<=[a-zA-Z])0+(\d*)', lambda m: m.group(1) if m.group(1) else '0', x) for x in s]
    print(res)
    

    参见Python演示

    此处,r'(?<=[a-zA-Z])0+(\d*)'正则表达式0+将ASCII字母((?<=[a-zA-Z]))之后的一个或多个零()匹配,然后使用捕获任何其他数字(0或更多)到组1中(\d*)。然后,在替换中,我们检查第1组是否为空,如果为空,则插入0(只有零),否则,我们插入第1组的内容(第一个前导零之后的剩余数字)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看