Регулярные выражения Python возвращают истину / ложь

115

Как с помощью регулярных выражений Python вернуть True/ False? Все возвращаемые Python:

<_sre.SRE_Match object at ...>
никто
источник

Ответы:

140

Matchобъекты всегда истинны и Noneвозвращаются, если совпадений нет. Просто проверьте правильность.

if re.match(...):
Игнасио Васкес-Абрамс
источник
21
re.match (...) вернет истину, если начальная часть строки соответствует обычному шаблону. В то время как поиск подтвердит шаблон в любом месте строки.
Yu Shen
8
Может быть, более желательно использовать if re.match(...) is None:вместо этого
NuclearPeon
извините, вы учли комментарии в своем ответе? Мне непонятно, не возражаете уточнить?
Чарли Паркер
2
Могу я спросить, почему re он так устроен? Если matchобъекты всегда истинны, почему они просто не возвращаются Trueв первую очередь, учитывая, что нам всегда нужно знать, истинен ли ответ или нет?
ytu
1
@ytu: Потому что тогда вы сможете делать все, что вам нужно .
Игнасио Васкес-Абрамс
149

Если вам действительно нужно Trueили False, просто используйтеbool

>>> bool(re.search("hi", "abcdefghijkl"))
True
>>> bool(re.search("hi", "abcdefgijkl"))
False

Как указывали другие ответы, если вы просто используете его как условие для ifили while, вы можете использовать его напрямую, не обертываяbool()

Джон Ла Рой
источник
1
boolЗначение необходимо, когда условный оператор содержит логическую арифметическую операцию. например: if (re.search ("a", "abc") & True):
Aizzat Suhardi
2
@AizzatSuhardi, &это побитовая операция. andбудет логической операцией.
Джон Ла Рой
1
спасибо @JohnLaRooy. Исправление:(re.search("a","abc") and True)
Айззат Сухарди
чем это отличается от ответа Игнасио?
Чарли Паркер
2
Обертка boolпроясняет намерения программиста для читателя.
Гильерме Саломе
10

Игнасио Васкес-Абрамс прав. Но чтобы уточнить, re.match()вернется либо None, который оценивает False, либо объект соответствия, который всегда будет таким, Trueкак он сказал. Только если вам нужна информация о части (ах), которая соответствует вашему регулярному выражению, вам нужно проверить содержимое объекта match.

Cory
источник
6

Один из способов сделать это - просто проверить возвращаемое значение. Поскольку вы получаете <_sre.SRE_Match object at ...>это, это означает, что это будет истинным. Если регулярное выражение не совпадает, вы получите возвращаемое значение None, которое оценивается как false.

import re

if re.search("c", "abcdef"):
    print "hi"

Производится hiкак вывод.

Гэвин Андерегг
источник
Вы всегда получаете возвращаемое значение; Noneиспользуется по умолчанию, если ничего явно не возвращается.
Игнасио Васкес-Абрамс
Спасибо - исправил. Я просто следил за тем, что видел в REPL.
Gavin Anderegg
4

Вот мой метод:

import re
# Compile
p = re.compile(r'hi')
# Match and print
print bool(p.match("abcdefghijkl"))
Вайбхав Десаи
источник
1
p = re.comp il e (r'hi ') :-P
Clay
да, и он возвращает "False"
Ufos
если вы измените matchна search, вернет True
alofgran
1

Вы можете использовать re.match()или re.search(). Python предлагает две разные примитивные операции, основанные на регулярных выражениях: re.match()проверяет совпадение только в начале строки, а re.search()проверяет совпадение в любом месте строки (это то, что Perl делает по умолчанию). сослаться на это

Сашини Хеттиараччи
источник