在Python中:我怎么说:如果line.partition('#'或'tab')......做某事

时间:2009-11-11 01:04:19

标签: python string

在Python中:我怎么说:

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

我知道我能做到:

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

但是标签字符的代码是什么,我可以说#或标签吗?

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

4 个答案:

答案 0 :(得分:10)

分区不允许选项,因此您可能需要re.split

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

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

但是你正在测试分区的返回值,它总是为True,所以我不确定你想要实现什么......

答案 1 :(得分:2)

'\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)的元组。

答案 2 :(得分: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("#")

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

答案 3 :(得分:0)

我首先将该行分为三部分,分区为#,然后再分为' \ t'。

可以做什么(如上所述的分区)是:

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

现在在first_word中你有\ t(tab)的部分分割。但是,如果还有其他类似的东西,你可以进一步拆分它。例如:

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

现在在first_word_2中你应该拥有你想要的东西。

取值