0

所以我有一个字符串

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

我明白为什么它不起作用。. 因为该值不是整数,但有什么方法可以在搜索找到该元素的地方使用该值?

4

5 回答 5

5

为什么还要为这个用例使用正则表达式?

s = '>n269412 | AK142815 | msdfhakjfdkjfs'
print s.partition('|')[0]
于 2013-03-12T20:36:06.553 回答
3

您不需要正则表达式:

first, rest = s.split('|', 1)
于 2013-03-12T20:36:34.927 回答
2

我认为re.match()提供了一个更直接的解决方案(即匹配所有内容,但不包括第一个|):

In [7]: re.match('[^|]*', s).group(0)
Out[7]: '>n269412 '

如果没有|,则返回整个字符串。从这个问题是否完全清楚这是否是你想要的。

但正如其他人所说,你真的不需要正则表达式......

于 2013-03-12T20:35:06.830 回答
0

re.search返回一个匹配对象,其中包含的不仅仅是一个索引。

您可能想要的是start索引:

>>> s[:p.start()]
'>n269412 '

顺便提一句。你需要修复你的正则表达式,因为这只会匹配一个''''(即什么都不匹配)。你想使用'\|'

p = re.search('\|', s)
于 2013-03-12T20:37:55.320 回答
0

该错误是因为 re.search 返回一个 MatchObject,您尝试对其进行切片但无法执行。请参阅研究文档

我会做以下事情:

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

有关切片字符串的更多信息,请参阅两个链接

于 2013-03-12T20:39:04.310 回答