在Python中:如何表示:如果line.partition('#'或'tab')...则做某事
在Python中,我想说:
line = line.partition('#' or 'tab')[0] ... do something with
我知道我可以这样做:
line = line.partition('#')[0] ... do something
但是,制表符的代码是什么?我可以用#或者tab来表示吗?
更新:我想要的效果是读取每行的第一个单词,如果遇到#,就忽略这个字符后面的所有内容(因为它是注释)。但是我发现,如果文件中的内容是第一个单词后面跟着一个制表符和#,那么它会把制表符当作第一个单词的一部分来读取。所以我想说,如果读取到制表符或者#,就把这一行当作注释。一个变通的方法是,在第一个单词后面加一个空格,而不是制表符。但这样看起来不太优雅。我现在意识到之前的if语句是不正确的,我试图把事情简化得太多。上面的代码现在是正确的,但我觉得Ned Batchelder的方法更好,不过也许现在你知道我想做什么后,还有其他的解决方案。
4 个回答
'\t'
是一个包含制表符的字符串。
import re
match = re.search('[#\t]', line)
if match:
i, j = match.span()
return (line[:i], line[i:j], line[j:])
return (line, '', '')
这将产生类似于分割的结果:一个包含 (头部, 分隔符, 尾部) 的元组。
partition这个函数不支持选项,所以你可能需要用到 re.split
:
re.split("(#|\t)", line, 1)
re.split
有一个有趣的特点,就是如果你把分隔符放在括号里,那么分隔符也会出现在结果中。而且你可以使用maxsplit(在这里我设置为1)。这样返回的结果会是一个三元组,跟partition的结果类似。
不过你在测试partition的返回值,而这个返回值总是True,所以我不太明白你想要达到什么效果……
因为注释是从#开始到行尾,所以我们通常会这样做。
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("#")
不过这并不是一个通用的解决方案,因为有时候注释前面的空格是有意义的。