所以我有一个字符串
s = '>n269412 | AK142815 | msdfhakjfdkjfs'
我希望包含所有内容但不包括“|”
的第一个实例所以我做的是
import re
p = re.search('|',s)
print s[:p]
但是我收到了这个错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: slice indices must be integers or None or have an __index__ method
我明白为什么它不起作用。 。因为那个值不是一个整数但有什么方法可以在搜索找到该元素时使用该值?
答案 0 :(得分:5)
为什么甚至打扰这个用例的正则表达式?
s = '>n269412 | AK142815 | msdfhakjfdkjfs'
print s.partition('|')[0]
答案 1 :(得分:3)
您不需要使用正则表达式:
first, rest = s.split('|', 1)
答案 2 :(得分:2)
我认为re.match()
提供了更直接的解决方案(即匹配所有内容但不包括第一个|
):
In [7]: re.match('[^|]*', s).group(0)
Out[7]: '>n269412 '
如果没有|
,则返回整个字符串。从这个问题来看,这是否是你想要的并不完全清楚。
但正如其他人所说,你真的不需要正则表达式......
答案 3 :(得分:0)
re.search
会返回a match object,其中包含的内容只有一个索引。
您可能想要的是start
索引:
>>> s[:p.start()]
'>n269412 '
顺便说一下。你需要修正正则表达式,因为它只匹配''
或''
(即没有)。您想使用'\|'
:
p = re.search('\|', s)
答案 4 :(得分:0)
该错误是因为re.search返回一个MatchObject,您尝试切片但不能这样做。请参阅re.search documentation。
我会做以下事情:
s = '>n269412 | AK142815 | msdfhakjfdkjfs'
# look for the pipe character
findPipe = s.find("|")
# replace everything after the pipe with empty string
s = s.replace(s[findPipe:], "")
print s