据我所知,
match
: 给定一个字符串 str 和一个模式 pat,match 检查 str 是否与 str 开头的模式匹配。
search
:给定一个字符串 str 和一个模式 pat,搜索检查 str 是否与 str 的每个索引中的模式匹配。
如果是这样,'^'
在正则表达式的开头使用匹配是否有含义?
据我了解,由于match
从一开始就已经检查过,所以没有。我可能错了;我的错误在哪里?
我相信没有用。以下是复制/粘贴自: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 ...>
在正常模式下,如果您使用匹配,则不需要 ^。但在多行模式 ( re.MULTILINE
) 中,它可能很有用,因为 ^ 不仅可以匹配整个字符串的开头,还可以匹配每行的开头。
当具体调用该函数时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')
这区分了单词的类型;行首的单词,行尾的单词,以及任何其他单词。