在Python中:如何表示:如果line.partition('#'或'tab')...则做某事

3 投票
4 回答
2039 浏览
提问于 2025-04-15 15:53

在Python中,我想说:

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

我知道我可以这样做:

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

但是,制表符的代码是什么?我可以用#或者tab来表示吗?

更新:我想要的效果是读取每行的第一个单词,如果遇到#,就忽略这个字符后面的所有内容(因为它是注释)。但是我发现,如果文件中的内容是第一个单词后面跟着一个制表符和#,那么它会把制表符当作第一个单词的一部分来读取。所以我想说,如果读取到制表符或者#,就把这一行当作注释。一个变通的方法是,在第一个单词后面加一个空格,而不是制表符。但这样看起来不太优雅。我现在意识到之前的if语句是不正确的,我试图把事情简化得太多。上面的代码现在是正确的,但我觉得Ned Batchelder的方法更好,不过也许现在你知道我想做什么后,还有其他的解决方案。

4 个回答

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, '', '')

这将产生类似于分割的结果:一个包含 (头部, 分隔符, 尾部) 的元组。

10

partition这个函数不支持选项,所以你可能需要用到 re.split

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

re.split 有一个有趣的特点,就是如果你把分隔符放在括号里,那么分隔符也会出现在结果中。而且你可以使用maxsplit(在这里我设置为1)。这样返回的结果会是一个三元组,跟partition的结果类似。

不过你在测试partition的返回值,而这个返回值总是True,所以我不太明白你想要达到什么效果……

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("#")

不过这并不是一个通用的解决方案,因为有时候注释前面的空格是有意义的。

撰写回答