#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. Этот метод возвращает два элемента, начальную позицию и конечную позицию соответствия.