【问题标题】:Is it possible to use regular expressions to find a pattern which is padded with zeros, and return the value without padding?是否可以使用正则表达式来查找用零填充的模式,并返回没有填充的值?
【发布时间】:2020-07-06 15:54:08
【问题描述】:

我有一个字母数字参考 ID 列表。它们有 3 位数字,左边补零,后跟一个字母,再后面跟 3 位数字,同样,左边补零。

例如。

original_ref_list = ["005a004",
                     "018b003",
                     "007a029",
                     "105a015"]

如您所见,两组数字都用零填充。我想获得相同的引用,但字母两侧没有零填充,但不删除所有零。

例如。

fixed_ref_list = ["5a4",
                  "18b3",
                  "7a29",
                  "105a15"]

我可以通过搜索三个正则表达式模式、组合结果并将其附加到列表中来做到这一点:

fixed_ref_list = list()
for i in original_ref_list:
    first_refpat = re.compile(r'[1-9]\d*[a-z]\d+')
    first_refpatiter = first_refpat.finditer(gloss[2])
    for first_ref_find in first_refpatiter:
        first_ref = first_ref_find.group()
        second_refpat = re.compile(r'[a-z]\d+')
        second_refpatiter = second_refpat.finditer(first_ref)
        for second_ref_find in second_refpatiter:
            second_ref = second_ref_find.group()[1:]
            third_refpat = re.compile(r'[1-9]\d*')
            third_refpatiter = third_refpat.finditer(second_ref)
            for third_ref_find in third_refpatiter:
                third_ref = third_ref_find.group()
    fixed_ref_list.append(first_ref[:-len(second_ref)] + third_ref)

但这似乎是一个尴尬的解决方案。是否有一种内置方法可以仅返回正则表达式模式的一部分,或者在返回结果之前删除填充?或者,有什么方法可以做我想做的不那么混乱的事情吗?

【问题讨论】:

  • 你的字符串中总是有两位数吗?例如005a004,或者018b003?
  • 并非总是如此,为了提出问题,我已经将问题归结为问题。我可以排除不采用这种格式的引用类型并区别对待它们。
  • 是的,请将它们与预期输出一起添加到问题中。
  • 它们不是必需的。我只想知道如何清理处理这种类型的代码部分。下面的两个答案效果很好。

标签: python regex zero-padding


【解决方案1】:

您可以像这样使用括号对匹配项进行分组:

re.match('([0-9a-f]{3})([0-9a-f])([0-9a-f]{3})', '005a004').groups()
> ('005', 'a', '004')

现在您可以使用一个元组。要删除开头的零,您可以使用 ^ 运算符匹配所有 0,该运算符标记字符串的开头并将它们替换为空字符串 ''

re.sub('^0+', '', '004')
> '4'

这应该会为您提供使这更加紧凑和可读所需的一切。

【讨论】:

    【解决方案2】:

    使用列表推导

    fixed_ref_list  = [str(int(x[:3])) + x[3] + str(int(x[4:])) for x in original_ref_list]
    

    结果

    print(fixed_ref_list)
    

    输出

    ["5a4",
     "18b3",
     "7a29",
     "105a15"]
    

    解释

    假设零填充在数字 0-9 上,使用 int(...) 删除字段中的零填充

    【讨论】:

      【解决方案3】:

      只需使用以下模式"0+ 并将其替换为"。见demo

      小心,因为你没有说你想对最后一个案例发生什么here

      如果您想将完整的十六进制数 "00000" 替换为 "0",您有

      "0*([0-9a-fA-F]+)"
      

      如图here

      【讨论】:

        猜你喜欢
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 2015-05-17
        • 1970-01-01
        • 1970-01-01
        • 2016-10-04
        相关资源
        最近更新 更多