在Python中:我怎么说:
line = line.partition('#' or 'tab')[0] ... do something with
我知道我能做到:
line = line.partition('#')[0] ... do something
但是标签字符的代码是什么,我可以说#或标签吗?
更新:我试图说读每一行的第一个单词,如果你读了#然后忽略该字符后的所有内容(因为它是一个注释)。但后来我发现如果我在文件中第一个单词tab#,那么它会将标签作为第一个单词的一部分。所以我试图说,如果你阅读了一个标签或一个哈希,那么将该行视为注释。解决方法是在第一个单词后面放一个空格而不是制表符。但它不是很优雅。我现在意识到if语句不正确,我试图简化太多事情。以上现在是正确的,但我认为Ned Batchelder的方式是现在的方式,但现在也许还有别的东西让你知道我想要做什么。
答案 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中你应该拥有你想要的东西。
取值