При вызове функции re.match
символ ^
не имеет большого значения, поскольку эта функция начинает процесс сопоставления в начале строки. Однако он имеет значение для других функций в модуле re и при вызове match для скомпилированного объекта регулярного выражения.
Например:
text = """\
Mares eat oats
and does eat oats
"""
print re.findall('^(\w+)', text, re.MULTILINE)
Это печатает:
['Mares', 'and']
С включенными re.findall()
и re.MULTILINE
он дает вам первое слово (без начального пробела) в каждой строке вашего текста.
Это может быть полезно, если вы делаете что-то более сложное, например, лексический анализ с регулярными выражениями, и передаете в скомпилированное регулярное выражение начальную позицию в тексте, с которой оно должно начинаться (которую вы можете выбрать в качестве конечной позиции из предыдущего совпадения). . См. документацию по методу RegexObject.match.
Простой лексер/сканер как пример:
text = """\
Mares eat oats
and does eat oats
"""
pattern = r"""
(?P<firstword>^\w+)
|(?P<lastword>\w+$)
|(?P<word>\w+)
|(?P<whitespace>\s+)
|(?P<other>.)
"""
rx = re.compile(pattern, re.MULTILINE | re.VERBOSE)
def scan(text):
pos = 0
m = rx.match(text, pos)
while m:
toktype = m.lastgroup
tokvalue = m.group(toktype)
pos = m.end()
yield toktype, tokvalue
m = rx.match(text, pos)
for tok in scan(text):
print tok
который печатает
('firstword', 'Mares')
('whitespace', ' ')
('word', 'eat')
('whitespace', ' ')
('lastword', 'oats')
('whitespace', '\n')
('firstword', 'and')
('whitespace', ' ')
('word', 'does')
('whitespace', ' ')
('word', 'eat')
('whitespace', ' ')
('lastword', 'oats')
('whitespace', '\n')
Это различает типы слов; слово в начале строки, слово в конце строки и любое другое слово.
person
Matt Anderson
schedule
26.05.2012