0

これが私がやろうとしていることです...私は次のような構造の文字列を持っています:

stringparts.bst? (キャリッジ リターン) 765945559287eghc1bg60aa26e4c9ccf8ac425725622f65a6lsa6ahskchksyttsutcuan99 (キャリッジ リターン) SPAM /198975/

これと一致するか返す必要があります:

765945559287eghc1bg60aa26e4c9ccf8ac425725622f65a6lsa6ahskchksyttsutcuan99

どの正規表現がトリックを行いますか?

私はこれを試しましたが、役に立たなかった:(

bst\?(.*)\n

アドバイスに感謝

4

4 に答える 4

1

私はこれを試しました。改行が1文字だけであると仮定します。

>>> s
'stringparts.bst?\n765945559287eghc1bg60aa26e4c9ccf8ac425725622f65a6lsa6ahskchks
yttsutcuan99\nSPAM /198975/'
>>> m = re.match('.*bst\?\s(.+)\s', s)
>>> print m.group(1)
765945559287eghc1bg60aa26e4c9ccf8ac425725622f65a6lsa6ahskchksyttsutcuan99
于 2013-04-28T23:52:54.877 に答える
0

これは、さまざまな種類の改行に対してより堅牢であり、そのような文字列のリスト全体がある場合に機能します。$とは行の^開始と終了を表しますが、実際の改行文字 (したがって\s+シーケンス) ではありません。

import re

BST_RE = re.compile(
    r"bst\?.*$\s+^(.*)$",
    re.MULTILINE
)

INPUT_STR = r"""
stringparts.bst?
765945559287eghc1bg60aa26e4c9ccf8ac425725622f65a6lsa6ahskchksyttsutcuan99
SPAM /198975/

stringparts.bst?
another
SPAM /.../
"""

occurrences = BST_RE.findall(INPUT_STR)

for occurrence in occurrences:
    print occurrence
于 2013-04-29T00:00:27.213 に答える
0

このパターンでは、次の前に空白を追加できます\n

r'bst\?\s*\n(.*?)\s*\n'

文字列内の空白がキャプチャされることを期待しない場合は、より単純なものを使用できます。ここでは、\s+を含む空白を消費し、連続する非空白をすべてキャプチャします。\n(\S+)

r'bst\?\s+(\S+)'
于 2013-04-29T08:31:39.883 に答える
0

あなたの正規表現は、bst?と最初の改行の間のすべてに一致しますが、これは何もありません。最初の 2 つの改行の間のすべてを一致させたいと思います。

bst\?\n(.*)\n

動作しますが、使用することもできます

\n(.*)\n

他のより具体的なケースでは機能しない場合がありますが

于 2013-04-28T23:51:27.123 に答える