2

Python3.3、OS X 7.5

次のように定義された 4 文字の部分文字列のすべてのインスタンスを見つけようとしています。

  • 最初の文字 = 'N'
  • 2 番目の文字 = 'P' 以外
  • 3 番目の文字 = 'S' または 'T'
  • 4 番目の文字 = 'P' 以外

私のクエリは次のようになります。

re.findall(r"\N[A-OQ-Z][ST][A-OQ-Z]", text)

これは、2 つの部分文字列が重複する 1 つの特定のケースを除いて機能しています。そのケースには、次の 5 文字の部分文字列が含まれます。

'...NNTSY...'

クエリは最初の 4 文字の部分文字列 ('NNTS') をキャッチしますが、2 番目の 4 文字の部分文字列 ('NTSY') はキャッチしません。

これは正規表現での私の最初の試みであり、明らかに何かが欠けています。

4

3 に答える 3

0

Python 3 ドキュメントから (強調を追加):

$ python3 -c '再インポート; help(re.findall)'
モジュール re の関数 findall に関するヘルプ:

findall(パターン、文字列、フラグ = 0)文字列内の重複しないすべての一致
    のリストを返します。

    パターンに 1 つ以上のキャプチャ グループが存在する場合は、
    グループのリスト; パターンの場合、これはタプルのリストになります
    には複数のグループがあります。

    空の一致が結果に含まれます。

インスタンスをオーバーラップさせたい場合regex.search()は、ループ内で使用します。コンパイルされていない正規表現の API は、開始位置を指定するパラメーターを使用しないため、正規表現をコンパイルする必要があります。

def findall_overlapping(pattern, string, flags=0):
    """Find all matches, even ones that overlap."""
    regex = re.compile(pattern, flags)
    pos = 0
    while True:
        match = regex.search(string, pos)
        if not match:
            break
        yield match
        pos = match.start() + 1
于 2013-09-01T01:58:33.423 に答える