我有这个
:NAME!NAME@NAME.tmi.twitch.tv PRIVMSG #CHANNEL :MESSAGE
我试图从第二个字母(在本例中是N)到下一个!
,在这种情况下是第六个字母。
关键是NAME
发生变化,可能会很长。但是,它只能包含A-Z,0-9和-
,所以我只能使用!
。最终输出为NAME
。
答案 0 :(得分:0)
尝试使用string.index(c)获取字符串中第一次出现c字符的索引。
在此之后你可以用它来切片:
i=string.index("!")
sliced = string[1:i]
答案 1 :(得分:0)
您可以通过以下方式利用字符串切片的强大功能:
>>> my_str = ":NAME!NAME@NAME.tmi.twitch.tv PRIVMSG #CHANNEL :MESSAGE"
>>> start_index, delimiter = 1, '!'
>>> my_str[start_index: my_str[start_index:].index(delimiter)+1]
'NAME'
或者,使用regex
作为:
>>> my_str = ":NAME!NAME@NAME.tmi.twitch.tv PRIVMSG #CHANNEL :MESSAGE"
>>> second_char = my_str[1] # second character of the string
>>> delimiter = "!" # your next character
>>> import re
>>> re.findall('{}.*{}'.format(second_char, delimiter), my_str)[0]
'NAME!'
PS:实现这一点的一般方法是考虑场景,假设起始索引位于第20个字符,第一个出现的!
出现在第5个索引处。然后mystr[20:5]
将为空。根据OP,他希望"到下一个!
" ,这是第20个字符后第一次出现!
。这里提到的大多数答案都没有解决这个问题。这就是我复杂的切片符号的原因,也是使用regex
(我是一个巨大的正则表达式仇恨者,但这是合理的选择)实现它。
答案 2 :(得分:0)
让我们开始寻找'!':
我们有string.find(string)
find功能来帮助我们,或string.index(string)
index功能。它们都将返回我们正在寻找的子字符串的索引(在我们的例子中是1个字符)。
现在,为cuttnig原始字符串。可以使用方括号(子串)来完成切割 - s[start:end:step]
是您的语法。
所以我们想从索引为1的char开始,到使用find或index找到的char。
假设s
是原始字符串:
s[1:s.find("!")]
应返回预期结果。如果你想让它具有包容性(包括'!'):
s[1:s.find("!") + 1] # Taking one index more
答案 3 :(得分:0)
s = ':NAME!NAME@NAME.tmi.twitch.tv PRIVMSG #CHANNEL :MESSAGE'
first = ':'
last = '!'
def find_between( s, first, last ):
try:
start = s.index( first ) + len( first )
end = s.index( last, start )
return s[start:end]
except ValueError:
return ""
答案 4 :(得分:0)
试试这个:
import re
a = ":NAME-87520!NAME@NAME.tmi.twitch.tv PRIVMSG"
match = re.findall(":([A-Z0-9-]*)!", a)
print(match[0])
答案 5 :(得分:0)
您可以使用正则表达式来获取第一个NAME,方法是检查字母数字和下划线组合的子字符串的第一个实例:
import re
string = ":NAME!NAME@NAME.tmi.twitch.tv PRIVMSG #CHANNEL :MESSAGE"
pattern = '[a-zA-Z0-9-]+'
result = re.search(pattern, string)
print(result.group(0))
[a-zA-Z0-9-]+
说"一组连续的字母数字和破折号,至少找到1个),re.search()
在字符串中搜索第一个实例。
要获取MESSAGE
,您可以使用字符串和str.rsplit
,或者右键拆分一次并获取最后一个结果:
msg = string.rsplit(':', 1)[-1]