You are currently viewing Регулярное выражение Python: re.search() против re.findall()

Регулярное выражение Python: re.search() против re.findall()

Предварительное условие: Регулярное выражение с примерами | Python
Регулярное выражение (иногда называемое рациональным выражением) представляет собой последовательность символов, определяющих шаблон поиска, в основном для использования при сопоставлении шаблонов со строками или сопоставлении строк, т. е. операциях, подобных “найти и заменить». Регулярные выражения-это обобщенный способ сопоставления шаблонов с последовательностями символов.
Модуль регулярных выражений (RE) определяет набор строк (шаблон), который ему соответствует. Чтобы понять аналогию с RE, метасимволы полезны, важны и будут использоваться в функциях модуля re.
Существует в общей сложности 14 метасимволов, и они будут обсуждаться по мере их включения в функции:

\ Используется для удаления специального значения символа
, следующего за ним (обсуждается ниже)
[] Представляет класс символов
^ Соответствует началу
$ Соответствует концу
. Соответствует любому символу, кроме новой строки
? Соответствует нулю или одному вхождению.
| Означает ИЛИ (Совпадает с любым из символов
, разделенных им.
* Любое количество случаев (включая 0 случаев)
+ Одно или несколько происшествий
{} Укажите количество совпадений предыдущего повторения
.
() Заключите группу REs 

re.search() (повторный поиск)

метод re.search() либо не возвращает ничего (если шаблон не совпадает), либо возвращает re.MatchObject, содержащий информацию о соответствующей части строки. Этот метод останавливается после первого совпадения, поэтому он лучше всего подходит для тестирования регулярного выражения, а не для извлечения данных.

Пример: 

# A Python program to demonstrate working of re.match().
import re

# Lets use a regular expression to match a date string
# in the form of Month name followed by day number
regex = r"([a-zA-Z]+) (\d+)"

match = re.search(regex, "I was born on June 24")

if match != None:

	# We reach here when the expression "([a-zA-Z]+) (\d+)"
	# matches the date string.

	# This will print [14, 21), since it matches at index 14
	# and ends at 21.
	print("Match at index % s, % s" % (match.start(), match.end()))

	# We us group() method to get all the matches and
	# captured groups. The groups contain the matched values.
	# In particular:
	# match.group(0) always returns the fully matched string
	# match.group(1) match.group(2), ... return the capture
	# groups in order from left to right in the input string
	# match.group() is equivalent to match.group(0)

	# So this will print "June 24"
	print("Full match: % s" % (match.group(0)))

	# So this will print "June"
	print("Month: % s" % (match.group(1)))

	# So this will print "24"
	print("Day: % s" % (match.group(2)))

else:
	print("The regex pattern does not match.")

Выход:

Match at index 14, 21
Full match: June 24
Month: June
Day: 24

re.findall() (найди все)

Возвращает все неперекрывающиеся совпадения шаблона в строке в виде списка строк. Строка сканируется слева направо, и совпадения возвращаются в найденном порядке.

Пример: 

# A Python program to demonstrate working of
# findall()
import re

# A sample text string where regular expression
# is searched.
string = """Hello my Number is 123456789 and
			my friend's number is 987654321"""

# A sample regular expression to find digits.
regex = '\d+'			

match = re.findall(regex, string)
print(match)

Выход:

['123456789', '987654321']