Справка по поиску длины python

#python #regex

#python #регулярное выражение

Вопрос:

Возможно ли прочитать длину выходных данных re.search?

Например:

 import re

list=['lost','post','cross','help','cost']

for i in range(len(list)):
  output = re.search('os', list[i])
  

Могу ли я прочитать длину вывода?

Комментарии:

1. Не используйте регулярные выражения для простого сравнения строк. Кроме того, правильный способ перебора списка for item in list . Пожалуйста, прочтите руководство по Python .

2. Длина чего именно?

3. @ThiefMaster: Я знаю, что RE — это слишком много для простой подстановки, но re.search работает быстрее, чем string.find, например, потому что он останавливается при первом появлении. Если у вас много строк, я предпочитаю использовать «ненормальный» способ, но это займет меньше времени.

4. str.find также выполняет поиск только по одному вхождению

5. Ах да? спасибо 🙂 Я начинаю с python. Однако я выбрал «if ‘string’ в списке: #сделать что-нибудь»

Ответ №1:

В этом случае длина вывода будет такой же, как длина ввода, потому что вы ищете определенную подстроку. При поиске в 'lost' длина совпадения будет 2 , потому что это то, чему равна длина параметра поиска. Теперь, если вы хотите различать «найдено» и «не найдено», помните, что это re.search возвращает None , если совпадения нет. Если вам действительно нужна длина, вы можете сделать это:

 for i in range(len(list)):
    length = 2 if re.search('os', list[i]) else 0
  

Я бы рекомендовал использовать более типичный цикл foreach, хотя:

 for item in list:
    length = 2 if re.search('os', item) else 0
  

И если все, что вы проверяете, это то, отображается ли одна строка внутри другой, что ж, вы можете использовать для этого in оператор:

 for item in list:
    length = 2 if 'os' in item else 0
  

Теперь, если вы ищете более сложное регулярное выражение, вы можете извлечь group 0 из соответствия, которое представляет собой всю подстроку, и проверить ее длину:

 for item in list:
    match = re.search('[aeiou]s', item)
    length = len(match.group(0)) if match else 0
  

Комментарии:

1. Теперь я понимаю, что возвращает длину выходных данных re.search … длину подстроки! Я был в замешательстве, и re.search — это не то, что мне нужно.

Ответ №2:

Прежде всего, присвоение нового имени встроенному list — действительно плохая идея. Во-вторых, это не очень Pythonic способ перебора списка. Все циклы Python предназначены для каждого цикла, поэтому просто выполните:

 word_list = ['lost','post','cross','help','cost']
for word in word_list:
    match = re.search("os", word)
  

При этом вы, вероятно, ищете методы сопоставления start и end , которые точно сообщают вам, где данное совпадение начинается в искомом тексте и где оно заканчивается.

 word_list = ['lost','post','cross','help','cost']
for word in word_list:
    match = re.search("os", word)
    if match is not None:
        print match.start(), match.end()
  

Очевидно, разница будет в длине. Учитывая ваш список слов, это выведет

 1 3
1 3
2 4
1 3
  

Ответ №3:

re.search() возвращает объект соответствия, который имеет метод span. Этот метод возвращает два элемента, начальную позицию и конечную позицию соответствия.