Python正则表达式 - 理解匹配和搜索之间的区别

时间:2012-05-26 12:44:34

标签: python regex string search match

根据我的想法,

match :给定字符串str和模式pat,匹配检查str是否与str的开始模式匹配。

search :给定字符串str和模式pat,搜索检查str是否匹配str的每个索引的模式。

如果是这样,在匹配的正则表达式的开头使用'^'是否有意义?

据我所知,由于match已经从一开始就检查过,所以没有。我可能错了;我的错在哪里?

3 个答案:

答案 0 :(得分:3)

我相信没有用。以下内容是从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 ...>

但请注意,在MULTILINE模式下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 ...>

答案 1 :(得分:2)

在正常模式下,如果使用匹配,则不需要^。 但是在多线模式(re.MULTILINE)中,它可能很有用,因为^不仅可以匹配整个字符串的开头,还可以匹配每一行的开头。

答案 2 :(得分: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')

这区分了单词的类型;一行中的一个单词,一行的一个单词和任何其他单词。