2017-02-05 82 views
-2

我有這個充分利用第二個字母串到一個特定的字符

:[email protected] PRIVMSG #CHANNEL :MESSAGE 

而我試圖讓一切從第二封信,在這種情況下是N,下一!,其中在這種情況下是第六個字母。

問題是NAME發生變化,可能會很長。但是,它只能包含A-Z,0-9和-,所以我應該沒問題就用!。最終輸出將是NAME

+0

在這種情況下,你只是想'NAME'? – roganjosh

+0

@krwllbrdr不正確。 –

+0

是的,我只是想要「名稱」,我編輯的帖子澄清。 – MibMoot

回答

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 
0

嘗試使用string.index(c)獲取字符串中第一次出現c字符的索引。通過使用regex作爲

>>> my_str = ":[email protected] PRIVMSG #CHANNEL :MESSAGE" 
>>> start_index, delimiter = 1, '!' 

>>> my_str[start_index: my_str[start_index:].index(delimiter)+1] 
'NAME' 

OR,:

在此之後,你可以用它來切片字符串:

i=string.index("!") 
sliced = string[1:i] 
+0

如果首次出現「!」在「N」之前,該怎麼辦? –

+0

它會引發錯誤,但我認爲他會使用該字符串格式 –

+0

@Moinuddin Quadri第一次出現「!」不能是實際名稱。只允許A-Z,0-9和'-'。 – MibMoot

0

您可以利用串通過在這裏做切片電源:

>>> my_str = ":[email protected] 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(我是一個巨大的正則表達式仇視,但它是一個合理的合適)來實現它的原因。

+1

是否有需要默認're'在這裏? 'segment = my_str [1:my_str.index('!')]'。我在澄清問題時發表了一系列答案,使得回答變得不可能:P – roganjosh

+0

@roganjosh是的。有'''在'N'之前的可能性(事實上在所提到的例子中不需要)。我想我不清楚,請隨時要求澄清(試圖保存額外的打字:P) –

+0

不,不,我的意思是,當我要求OP在第一篇文章下澄清...在我得到答覆之前,有人已經提出了答案,然後在答案中出現了一些達爾文的瘋狂(一個人被迅速殺死)。我在'N'事件之前同意你的'!',但如果不能發生,那麼它很重。 – roganjosh

0
s = ':[email protected] 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 "" 
0

試試這個:

import re 
a = ":[email protected] PRIVMSG" 

match = re.findall(":([A-Z0-9-]*)!", a) 
print(match[0]) 
0

您可以使用正則表達式來獲得的第一個名字,通過檢查字母數字的字符串的第一個實例,並強調結合:

import re 

string = ":[email protected] 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] 
相關問題