При вызове функции 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')
Это различие между типами слова; слово в начале строки, слово в конце строки и любое другое слово.
Вы прочитали это? http://docs.python.org/library/re.html#search-vs-match. Это объясняет все. – jamylak