【问题标题】:pythonic method for extracting numeric digits from string从字符串中提取数字的pythonic方法
【发布时间】:2021-11-26 01:29:40
【问题描述】:

我正在开发一个程序来读取 CSV 文件并从中创建信息字典。 CSV 中的每一行本质上是一个新的字典条目,其中分隔对象是值。

作为任务的一个子部分,我需要从字符串中提取未知数量的数字。我有一个工作版本,但它似乎不是很pythonic。

示例字符串如下所示:

variable = Applicaiton.Module_Name.VAR_NAME_ST12.WORD_type[0]

variable是python代码中的字符串名称,代表MODBUS中的变量名。我只想提取 .WORD_type[0] 之前的数字,这些数字与字符串打包到的字节数有关。

这是我的工作代码,请注意,它嵌套在 for 语句中,该语句遍历 CSV 中的行。 var_lengthvar_typekeys 的一部分,即{"var_length": var_length}

if re.search(".+_ST[0-9]{1,2}\\.WORD_type.+", variable):
    var_type = "string"
    temp = re.split("\\.", variable)
    temp = re.split("_", temp[2])
    temp = temp[-1]
    var_length = int(str.lstrip(temp, "ST")) / 2

【问题讨论】:

  • 这绝对是xy problem。询问您实际尝试实现的目标并显示实际输入和所需输出。 csv.DictReaderstr.isdigit 可能可以完成大部分繁重的工作。
  • 您说存在“未知的数字位数”,但您的正则表达式将其限制为 1 位或 2 位。也不清楚变量的名称是variable 还是variable 实际上是字符串的一部分。
  • @DeepSpace,我无法使用csv 模块,因为设备上可用的模块有限。也有字符串中可能有其他数字的情况。
  • @Selcuk 我现在将其限制为 2 位数字,因为这些实际上对应于变量在 MODBUS 中打包的字节数。
  • 为什么不能简单地将现有的正则表达式与捕获组一起使用,例如print(re.search(".+_ST([0-9]{1,2})\\.WORD_type.+", variable).groups()) 而不是尝试再次解析字符串,使用拆分和切片?

标签: python python-re


【解决方案1】:

您可以尝试使用这样的匹配组:

import re

variable = "Applicaiton.Module_Name.VAR_NAME_ST12.WORD_type[0]"
matches = re.match(r".+_ST(\d+)\.WORD_type.+", variable)
if matches:
    print(matches[1])

matches[0] 包含完整匹配,matches[1] 包含匹配组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2017-12-17
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2011-11-21
    相关资源
    最近更新 更多