2

据我所知,

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

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

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

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

4

3 回答 3

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 ...>

以 with 开头的正则表达式'^'可用于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()以 with 开头的正则表达式'^'将匹配每行的开头。

>>> re.match('X', 'A\nB\nX', re.MULTILINE)  # No match
>>> re.search('^X', 'A\nB\nX', re.MULTILINE)  # Match
<_sre.SRE_Match object at ...>
于 2012-05-26T12:48:41.917 回答
2

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

于 2012-05-26T12:47:36.113 回答
2

当具体调用该函数时re.match,该^字符确实没有什么意义,因为该函数在行首开始匹配过程。但是,它对 re 模块中的其他函数以及在编译的正则表达式对象上调用 match 时确实有意义。

例如:

text = """\
Mares eat oats
and does eat oats
"""

print re.findall('^(\w+)', text, re.MULTILINE) 

这打印:

['Mares', 'and']

re.findall()启用and后,它会在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')

这区分了单词的类型;行首的单词,行尾的单词,以及任何其他单词。

于 2012-05-26T16:25:33.723 回答