【问题标题】:Python - .split(), - two argumentsPython - .split(), - 两个参数
【发布时间】:2021-04-18 19:47:39
【问题描述】:

我需要对 python 代码进行修改。

此代码从 .csv 文件中抓取信息,最终以不同的结构将其集成到新的 .csv 文件中。

在源文件的一列中,我有一个值(字符串),99% 的时间都是这样形成的:'block1 block2 block3'。

Block2 在 99% 的情况下总是以值 'm' 结束。

示例:“R2 180m RFT”。

通过浏览源数据集,我意识到在 1% 的情况下,block2 可以以“M”结尾。

因为我需要 'm' 或 'M' 值之后的所有值,所以我有点卡住了。

我使用了 .split() 函数,就像在我的 :

'Newcolumn': getattr(row_unique_ids, 'COLUMNINTHEDATASET').split ('m') [1],

这样做,我的脚本出错了,因为它落在了这种风格的值上: R2 180M AST'。

所以我想知道如何集成一个额外的参数,如果脚本落在“m”或“M”上,这将使我能够很好地进行拆分。

感谢您的帮助。

【问题讨论】:

  • 是否有其他模式可以识别,例如在 m 或 M 之前总是有一个数字,所以如果它以一个数字结尾,你可以在那里拆分?
  • 您可以在应用拆分之前将字符串转换为小写,您尝试过吗?
  • 为什么不在空间分割,只获取结果列表的最后一个元素?
  • 如果你必须有多个字符,re.split 可以适应这个。
  • 这能回答你的问题吗? Python: Split string by list of separators

标签: python


【解决方案1】:

一个解决方案是

s = getattr(row_unique_ids, 'COLUMNINTHEDATASET')
s = s.lower()
s.split('m')[1]

但这会弄乱你的外壳。如果要保存外壳, 另一种解决方案是:

x = ''
s = getattr(row_unique_ids, 'COLUMNINTHEDATASET')
for c in s:
  if c == 'M'
    x += 'm'
  x += c
x.split('m')[1]

【讨论】:

  • 第一个解决方案只是将属性名称小写,这几乎肯定不存在。
  • 第二种解决方案将不起作用,因为当您使用 'm' 拆分时,某些行将仅保留列表中的 1 项,而您将获得 'list index out of range'
  • 钢不工作,在你的循环之后,线看起来像''R2 180mM RFT'。在提交之前测试您的解决方案
  • 是的,属性名称小写时出现语法错误,总体思路应该仍然有效。现在可以了。
【解决方案2】:

进行多参数拆分的一种方法通常是:

import re

string = "this is 3an infamous String4that I need to s?plit in an infamou.s way"

#Preserve the original char
print (re.sub(r"([0-9]|[?.]|[A-Z])",r'\1'+"DELIMITER",string).split('DELIMITER'))

#Discard the original char
print (re.sub(r"([0-9]|[?.]|[A-Z])","DELIMITER",string).split('DELIMITER'))

输出:

['this is 3', 'an infamous S', 'tring4', 'that I', ' need to s?', 'plit in an infamou.', 's way']
['this is ', 'an infamous ', 'tring', 'that ', ' need to s', 'plit in an infamou', 's way']

在您的上下文中:

import re

string = "R2 180m RFT R2 180M RFT"

print (re.sub(r"\b([0-9]+)[mM]\b",r'\1'+"M",string).split('M'))
#print (re.sub(r"\b([0-9]+)[mM]\b",r'\1'+"M",getattr(row_unique_ids, 'COLUMNINTHEDATASET')).split('M'))

输出:

['R2 180', ' RFT R2 180', ' RFT']

如果mM 前面有数字,它将分开。

【讨论】:

  • 很好的答案,这绝对是更详细的,赞成!
  • Whyyyy...当您可以进行正则表达式拆分并完成时,您会先进行正则表达式替换,然后再进行字符串拆分吗? re.split('[mM]', 'R2 180m RFT')
  • 还有([0-9]|[?.]|[A-Z])是一种不必要的复杂写作方式([0-9?.A-Z])
  • 普通字符串拆分也不会保留分隔符(并且 OP 也不想保留分隔符)。如果您要引入 re 包和正则表达式,那么您只是使整个事情一个数量级或数量级对于 OP 来说更加复杂,将 re.split() 留给他们不会让事情变得更容易。更不用说re.split() 上的解决方案比您建议的更短且更容易遵循。
  • 我正在尝试改进您的答案。没有必要变得活泼。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2014-12-13
  • 1970-01-01
  • 2021-08-13
  • 2016-03-14
  • 1970-01-01
  • 2020-10-01
相关资源
最近更新 更多