0

特定の文字列が個々の文字に続くまで、一連の文字を返すように re モジュールを使用しようとしています。re documentation は、これを達成するために (?!...) を使用できることを示しているようです。私が現在取り組んでいる例:

str_to_search = 'abababsonab, etc'
first = re.search(r'(ab)+(?!son)', str_to_search)
second = re.search(r'.+(?!son)', str_to_search)

first.group() は「abab」です。これが私が目指しているものです。ただし、次の「b」の直後に「son」が続くため、「ababa」で停止させようとしているにもかかわらず、second.group() は str_to_search 文字列全体を返します。どこが間違っていますか?

4

3 に答える 3

2

単純なことではありませんが、「'son' が続かない文字」の繰り返しシーケンスをキャプチャできます。この繰り返される式は、非キャプチャ グループ (?: ... ) 内にある必要があるため、一致結果が混乱することはありません。(余分なマッチ グループになってしまいます)

これを試して:

import re

str_to_search = 'abababsonab, etc'
second = re.search(r'(?:.(?!son))+', str_to_search)
print(second.group())

出力:

ababa

こちらをご覧ください: http://ideone.com/6DhLgN

于 2013-11-07T19:35:14.537 に答える
1

これはうまくいくはずです:

second = re.search(r'(.(?!son))+', str_to_search)
#output: 'ababa'
于 2013-11-07T19:39:11.017 に答える
0

あなたが何をしようとしているのかわからない

  1. string.partition を確認してください

  2. 「.+?」それ以外の場合は貪欲で、すべてを取得します

  3. 特にグループ番号を渡すときは、group(...) と groups(..) のドキュメントを読んでください

于 2013-11-07T19:32:16.297 に答える