2017-01-04 2 views
-2

Есть много вопросов и ответов для извлечения вспомогательных строк, которые являются полезными, но они не отвечают на мой вопрос и не совпадают.Как извлечь строку из 32 символов из строки в python?

У меня есть md5 хэш (32 непрерывных шестнадцатеричных символов) в пределах строки, например:

Пример 1:

Hi here is the hash: 1a159f8cb5b29887efc124af4d2702dc thank you!

Пример 2:

1a159f8cb5b29887efc124af4d2702dc There is the hash! Thanks!

Мой вопрос как я могу извлечь хэш из этого, учитывая, что символы вокруг значения хэша могут измениться, и хэш не будет в том же месте каждый раз, следовательно, разные примеры.

РЕШЕНИЕ: Выход = re.search ('[0-9a-FA-F], {32}', input_str)

+1

если вы попросите Python, почему вы добавляете тег grep? Кроме того, что вы пробовали? – fedorqui

+0

Ищите непрерывную последовательность из 32 символов, которая содержит только '[a-zA-Z0-9]'. В противном случае вы должны быть более конкретными, вы не можете автоматически извлекать что-то, если у него нет минимального шаблона, который он встречает. – Maroun

+1

Используйте регулярное выражение. – RemcoGerlich

ответ

1
import re 

str1 = "Hi here is the hash: 1a159f8cb5b29887efc124af4d2702dc thank you!" 
str2 = "1a159f8cb5b29887efc124af4d2702dc There is the hash! Thanks!" 

def get_hash(input_str): 
    output = re.search('[0-9a-fA-F]{32}', input_str) 
    if output: 
     return output.group(0) 

print get_hash(str1) 
print get_hash(str2) 
+0

что если есть ли хэш длиннее 32 символов? Вы получаете только часть этого хэша, но вы должны пропустить его. – furas

+0

@furas: это не определено вопросом, я бы сказал. – RemcoGerlich

+0

Единственными хэшами, с которыми я буду иметь дело, являются MD5, длина которых составляет 32 символа, однако, используя это, я получаю сообщение об ошибке: AttributeError: объект «NoneType» не имеет атрибута «группа». Я предполагаю, что это потому, что он возвращает Нет? – dperrie

1

Вот стартер для вас,

>>> s = 'Hi here is the hash: 1a159f8cb5b29887efc124af4d2702dc thank you!' 
>>> def extract_hash(s, sz=32): 
     m = re.search(r'\b[0-9a-fA-F]{%d}\b' % sz, s).group(0) 
     if m: 
      return m 


>>> extract_hash(s) 
'1a159f8cb5b29887efc124af4d2702dc' 

>>> s = '1a159f8cb5b29887efc124af4d2702dc There is the hash! Thanks!' 
>>> 
>>> 
>>> extract_hash(s) 
'1a159f8cb5b29887efc124af4d2702dc' 

Это зависит от того, что хэш сделан из шестнадцатеричных символов в диапазоне (0-9, AF) и длины хеша, который вы предоставляете.

EDIT:

Добавлена ​​длина хэша по умолчанию будет 32, если не предусмотрено в качестве входных данных.

+0

Вы должны поместить длину шаблона в регулярное выражение (как '{32}'), потому что в настоящее время, если что-то еще совпадает с хешем, хеш пропущен. – RemcoGerlich

+0

@RemcoGerlich, я полагаю, что хэш попал между границами слов и должен соответствовать только [0-9a-fA-F], что должно препятствовать сопоставлению любых других символов из других строк, если у вас нет примера, чтобы доказать свою Комментарии? –

+1

Ну, предположим, что число 12 встречается раньше в строке в несвязанном тексте, тогда это соответствует и будет вашей группой 0. – RemcoGerlich

Смежные вопросы