2017-02-05 1 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, на символ, который мы нашли, используя find или index.

Предполагая s является исходная строка:

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

Если вернуть ожидаемый результат. И если вы хотите, чтобы он был инклюзивным (включая «!«):

s[1:s.find("!") + 1] # Taking one index more 
0

Попробуйте string.index (c), чтобы получить индекс первого вхождения символа c в строке.

После этого вы можете использовать его для среза строку:

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" 
>>> start_index, delimiter = 1, '!' 

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

ИЛИ, с помощью использования regex как:

>>> 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

Нет, я имею в виду, когда я прошу ОП разъяснить в первом сообщении ... прежде чем я получу ответ на это, кто-то уже сформулировал ответ, а затем в ответах есть какое-то дарвиновское безумие (один быстро убит). Я соглашаюсь на ваш '!' Перед случаем '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 

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] 
Смежные вопросы