2012-05-26 2 views
2

Из того, что я понял,питон регулярное выражение - понимание разницы между спичкой и поиск

match: дана строка ул и шаблон погладить, матч проверки, если строка соответствует шаблону от начала ул в.

search: дана строка ул и шаблон погладить, поиска проверяет, ул соответствует образцу от каждого индекса ул.

Если да, значит ли смысл использовать '^' в начале регулярного выражения с совпадением? От того, что я понял, поскольку матч уже проверяет с самого начала, нет. Возможно, я ошибаюсь, где моя ошибка?

Спасибо!

+3

Вы прочитали это? http://docs.python.org/library/re.html#search-vs-match. Это объясняет все. – jamylak

ответ

2

При вызове функции 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') 

Это различие между типами слова; слово в начале строки, слово в конце строки и любое другое слово.

2

В нормальном режиме вам не нужно ^, если вы используете совпадение. Но в многострочном режиме (re.MULTILINE) это может быть полезно, потому что^может соответствовать не только началу всей строки, но и началу каждой строки.

+0

так re.MULTILINE не имеет смысла без^при запуске? – user1413824

+0

@ user1413824 Кажется, что за исключением того, что '' 'также влияет. Согласно документам Python, все, что делает 're.MULTILINE', изменяет значения'^'и' $ ' – chys

2

Я считаю, что бесполезно. Ниже приводится копия/вставить из: http://docs.python.org/library/re.html#search-vs-match

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

Например:

>>> re.match("c", "abcdef") # No match 
>>> re.search("c", "abcdef") # Match 
<_sre.SRE_Match object at ...> 

Регулярные выражения, начинающиеся с '^' могут быть использованы с search() ограничить матч в начале строки:

>>> re.match("c", "abcdef") # No match 
>>> re.search("^c", "abcdef") # No match 
>>> re.search("^a", "abcdef") # Match 
<_sre.SRE_Match object at ...> 

Заметим, однако, что в режиме многострочного match() только соответствует началу строки, тогда как использование search() с регулярным выражением, начинающимся с '^', будет совпадать в начале каждой строки.

>>> re.match('X', 'A\nB\nX', re.MULTILINE) # No match 
>>> re.search('^X', 'A\nB\nX', re.MULTILINE) # Match 
<_sre.SRE_Match object at ...> 
+0

, так что^в начале регулярного выражения с совпадением бессмысленно правильно? – user1413824

+0

Ну сам символ можно использовать для других вещей, например, в '[^ \ w]' например, но я не вижу никакой пользы для него для проверки начала. – jamylak

Смежные вопросы