re.match
закріплюється на початку рядка. Це не має нічого спільного з новими рядками, тому це не те саме, що використання ^
у шаблоні.
Як зазначено в документації на повторний збір :
Якщо нуль або більше символів на
початку рядка відповідають шаблону регулярних виразів, поверніть відповідний MatchObject
екземпляр. Повернути, None
якщо рядок не відповідає шаблону; зауважте, що це відрізняється від нульової довжини.
Примітка. Якщо ви хочете знайти відповідність будь-де в рядку, використовуйте search()
замість цього.
re.search
шукає весь рядок, як зазначено в документації :
Перегляньте рядок, шукаючи місце, де шаблон звичайного вираження створює відповідність, і поверніть відповідний MatchObject
екземпляр. Повернення, None
якщо жодна позиція в рядку не відповідає шаблону; зауважте, що це відрізняється від знаходження відповідності нульової довжини в якийсь момент рядка.
Тож якщо вам потрібно співставити на початку рядка, або щоб відповідати всьому використанню рядка match
. Це швидше. В іншому випадку використовуйте search
.
Документація має специфічний розділ для match
порівняння,search
який також охоплює багаторядкові рядки:
Python пропонує дві різні примітивні операції на основі регулярних виразів: match
перевіряє відповідність
лише на початку рядка, тоді як search
перевіряє відповідність
будь-де в рядку (це те, що Perl робить за замовчуванням).
Зауважте, що match
може відрізнятися search
навіть від використання звичайного виразу, що починається з '^'
: '^'
відповідає лише на початку рядка, або в
MULTILINE
режимі, також безпосередньо після нового рядка. Операція " match
" проходить успішно, лише якщо шаблон узгоджується на початку рядка
незалежно від режиму або в початковому положенні, заданому необов'язковим pos
аргументом, незалежно від того, чи передує йому новий рядок.
Тепер достатньо розмов. Час переглянути приклад коду:
# example code:
string_with_newlines = """something
someotherthing"""
import re
print re.match('some', string_with_newlines) # matches
print re.match('someother',
string_with_newlines) # won't match
print re.match('^someother', string_with_newlines,
re.MULTILINE) # also won't match
print re.search('someother',
string_with_newlines) # finds something
print re.search('^someother', string_with_newlines,
re.MULTILINE) # also finds something
m = re.compile('thing$', re.MULTILINE)
print m.match(string_with_newlines) # no match
print m.match(string_with_newlines, pos=4) # matches
print m.search(string_with_newlines,
re.MULTILINE) # also matches