【问题标题】:Reading strings in python在python中读取字符串
【发布时间】:2021-04-10 11:23:14
【问题描述】:

我正在使用python尝试将信息与这种类型的字符串分开:

r = "(-0.04530261550379927+0j) [X0 X1 Y2 Y3]"

最终我需要的信息是括号中的数字,并将字母与数组中的数字分开。所以在上面的例子中,我想得到的结果是:数字-0.04530261550379927,一个数组:[X, X, Y, Y],另一个数组:[0, 1, 2, 3]

我一直在尝试使用re.match,但由于这是我第一次使用这个模块,我觉得它很混乱。

不胜感激。

【问题讨论】:

  • 您可以通过精心选择的示例输入和相应的输出来分享解决此问题的最佳尝试,这可能是一个很好的起点,可以帮助您了解代码需要哪些改进。此外,有些地方还不清楚:1/ 样本数据包含一个复数,您的预期输出是一个浮点数。虚部呢? 2/ 在第二部分中,是否总是正好是一个字母后跟一个数字,而这正好是四次?请澄清。
  • @ThierryLathuille 对于我拥有的所有数据,虚部始终为 0,因此没问题。在第二部分,有时数组可能是空的,否则它总是一个字母后跟一个数字,不一定是四次,也可能是一、二或三。

标签: python string match python-re


【解决方案1】:

你可以这样做:

import re

r = "(-0.04530261550379927+0j) [X0 X1 Y2 Y3]"
match = re.match(r"\(([-+]?\d+(?:\.\d+)?)\+\d+j\) \[((?:[XYZ]\d(?: [XYZ]\d)*)?)]", r)
number, array = match.groups()

number = float(number)
a1, a2 = [], []
for i in array.split():
    a1.append(i[0])
    a2.append(int(i[1]))

print(number, a1, a2)

说明:

正则表达式模式r"\(([-+]?\d+(?:\.\d+)?)\+\d+j\) \[((?:[XYZ]\d(?: [XYZ]\d)*)?)]" 匹配给定的字符串:

  • part ([-+]?\d+(?:\.\d+)?) 匹配数字
  • part ((?:[XYZ]\d(?: [XYZ]\d)*)?) 匹配数组
  • 有定义为(?:<match>)的非捕获组

match.groups() 返回所有捕获组的列表(在我们的例子中为 2 个),我们将列表解压缩为变量 numberarray

接下来,我们将存储在array 中的字符串按空格拆分并遍历项目:

  • 第一个字符附加到a1
  • 第二个字符转换为int并附加到a2

输出:

-0.04530261550379927 ['X', 'X', 'Y', 'Y'] [0, 1, 2, 3]

【讨论】:

  • +1 请注意,数字 [\d]+ 不必在方括号之间。作为一个小建议,如果您在组中使用前导空格重复方括号之间的最后一部分,则不需要问号,那么就没有尾随空格。 \(([-+]?\d+(?:\.\d+)?)\+\d+j\) \[([XYZ]\d(?: [XYZ]\d)*)]regex101.com/r/HbDlN7/1
  • @Thefourthbird,感谢指正!我会更新答案。但是您建议的正则表达式的一个问题是它与空数组不匹配,因此我将跳过该部分
  • 很抱歉我错过了那部分。在这种情况下,您可以将整个重复部分设为可选。 regex101.com/r/M7GNuZ/1
  • 是的,我这样做并更新了答案,谢谢)
  • @GoldenLion [-+]? 匹配 -+ 或不匹配,\d+ 匹配数字序列,(?:) 是非捕获组,因此 (?:\.\d+)? 匹配数字的浮点部分(如果存在)捕获该组,这样做我们将不会在调用match.groups() 时收到不需要的组。希望对您有所帮助,如果答案有帮助,请不要忘记投票:)
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
相关资源
最近更新 更多