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は、正規表現に基づいて2つの異なるプリミティブ操作を提供します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 ...>
于 2012-05-26T12:48:41.917 に答える
2

通常モードでは、matchを使用している場合は^は必要ありません。ただし、複数行モード(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()とを有効にする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 に答える