【问题标题】:In Python: how do I say: if line.partition('#' or 'tab') ... do something在 Python 中:我怎么说:if line.partition('#' or 'tab') ... do something
【发布时间】:2009-11-11 01:04:18
【问题描述】:

在 Python 中:我怎么说:

line = line.partition('#' or 'tab')[0]   ... do something with 

我知道我能做到:

line = line.partition('#')[0]  ... do something

但是制表符的代码是什么,我可以说#或制表符吗?

更新:我想说的是阅读每行的第一个单词,如果您阅读 # 则忽略该字符之后的所有内容(因为它是注释)。但后来我发现如果我在文件中有第一个单词标签#,那么它会将标签作为第一个单词的一部分读取。所以我想说,如果你读到一个标签或一个哈希,那么把这行当作评论。一种解决方法是在第一个单词而不是制表符之后放置一个空格。但它不是很优雅。我现在意识到 if 语句是不正确的,我试图将事情简化太多。上面现在是正确的,但我认为 Ned Batchelder 的方式是现在要走的路,但也许现在你知道我要做什么了。

【问题讨论】:

  • partition 总是返回一个包含 3 个项目的元组,所以你的 if 永远是 true
  • 这是一个奇怪的问题,因为 string.partition() 返回一个由第一部分、分隔符和第二部分组成的 3 元组。你不会在 if 语句中那样使用它。更有可能存储结果然后检查是否 returnvalue[1] == ''
  • 你想做什么?这段代码 sn-p 是不明智的。

标签: python string


【解决方案1】:

分区不允许选项,所以你可能需要re.split:

re.split("(#|\t)", line, 1)

re.split 有一个有趣的属性,如果模式包含在括号中,那么分隔符会在结果中返回,并且您可以使用 maxsplit(因为我在这里设置为 1)。这将返回一个类似于分区的三元组。

但是您正在测试分区的返回值,该值始终为 True,所以我不确定您要达到什么目的......

【讨论】:

  • 我不知道将正则表达式括在括号中时会返回拆分分隔符。每天学习一些东西。 +1
  • 这个不错。如果未找到 sep,则行为与分区略有不同。
【解决方案2】:

由于注释是从#到行尾,所以我们通常做的就是这样。

raw_data, _, _ = line.partition("#")
data= raw_data.strip()
if len(data) == 0:
    continue # or whatever, the data part of the line is empty
# you have data 

关键是不要尝试将注释处理与空格剥离结合起来。

[raw_data, _, _ = line.partition("#")会将“#”之前的部分保存在raw_data中,它将“#”保存在名为_的变量中。它还将保存名为_ 的变量中“#”之后的部分。我们将忽略名为_ 的变量,所以我们不在乎它有什么值。]

你也可以这样做

data, _, _ = line.strip().partition("#")

这不是一个通用的解决方案,因为有时评论前面的空格是有意义的。

【讨论】:

  • @SilentGhost:我很难解释if not data: 以及零长度字符串等同于False 的事实。它导致太多错误的想法。当人们寻找其他方法来处理 Python 类型的特殊特征时,他们的眼中闪烁着奇怪的光芒。叹息。
  • 谢谢 S.lott,但是 raw_data、_、_ 是做什么用的?
【解决方案3】:

'\t' 是包含制表符的字符串。

import re

match = re.search('[#\t]', line)
if match:
    i, j = match.span()
    return (line[:i], line[i:j], line[j:])
return (line, '', '')

这将给出类似于分区的结果:一个 (head, sep, tail) 的元组。

【讨论】:

    【解决方案4】:

    我会先把这条线分成三部分,用 # 隔开,然后再用 '\t' 隔开。

    可以做的事情(如上所述的分区)是:

    first_word, space, rest = Line.partition('\t')

    现在在 first_word 中,您将部分拆分为 \t(制表符)。但是,您可以进一步拆分它,以防有其他类似 #.示例:

    first_word_2, s_2, r_2=first_word.partition('#')

    现在在 first_word_2 你应该有你想要的。

    S

    【讨论】:

      猜你喜欢
      • 2011-11-21
      • 2015-02-06
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2015-11-29
      • 2020-01-14
      相关资源
      最近更新 更多