2017-02-05 13 views
-2

私はこのは、特定の文字に2つ目の文字から文字列を取得する

:[email protected] PRIVMSG #CHANNEL :MESSAGE 

ていると私は次の!に、この場合にはNである第二の手紙からのすべてを取得しようとしていますこの場合は6番目の文字です。

ポイントはNAMEで、かなり長くなる可能性があります。しかし、A-Z、0-9と-しか含めることができないので、私はちょうど!を使ってうまくいくはずです。最終出力はNAMEとなります。

+0

この場合、あなただけの 'NAME'をしたいですか? – roganjosh

+0

@krwllbrdrが間違っています。 –

+0

はい、「名前」がほしいだけです。投稿を編集して明確にしました。 – MibMoot

答えて

0

はそれを見つけることで始まるのをしてみましょう '!':

私たちは、私たちを助けるためにstring.find(string)find機能、またはstring.index(string)index機能を持っています。彼らは、探している部分文字列のインデックスを返します(この場合は1文字)。

ここで、元の文字列をカットする。カッティングは角括弧(部分文字列)を使用して行うことができます - s[start:end:step]は構文です。

したがって、インデックス1のcharから、findまたはindexを使用して見つかったcharに開始します。

s[1:s.find("!")] 

が期待される結果を返す必要があります:sを想定し

は、元の文字列です。そしてあなたが包括的であることを望むなら( '!「):

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] 
関連する問題