49

サンプル文字列があります<alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card] ...>, created=1324336085, description='Customer for My Test App', livemode=False>

値だけが必要で、cus_Y4o9qMEZAugtnWNOT card(別の内部にあります[])は必要ありません

Pythonで可能な限り最も簡単な方法でそれを行うにはどうすればよいですか?たぶん、RegEx(私は得意ではありません)を使用することによって?

4

7 に答える 7

95

どうですか:

import re

s = "alpha.Customer[cus_Y4o9qMEZAugtnW] ..."
m = re.search(r"\[([A-Za-z0-9_]+)\]", s)
print m.group(1)

私にとって、これは次のように印刷されます:

cus_Y4o9qMEZAugtnW

への呼び出しre.search(...)は、正規表現との最初の一致を検出するため[card]、検索を 2 回繰り返さない限り検出されないことに注意してください。

編集:ここでの正規表現は python raw stringliteralです。これは基本的に、バックスラッシュが特殊文字として扱われず、re.search()変更されずにメソッドに渡されることを意味します。正規表現の部分は次のとおりです。

  1. \[[リテラル文字に一致
  2. (新しいグループを始める
  3. [A-Za-z0-9_]任意の文字 (大文字または小文字)、数字、またはアンダースコアに一致する文字セットです
  4. +前の要素 (文字セット) に 1 回以上一致します。
  5. )グループを終了します
  6. \]]リテラル文字に一致

編集: DK が指摘したように、正規表現は次のように簡略化できます。

m = re.search(r"\[(\w+)\]", s)

は、との設定に依存する\wのと同じことを意味する特殊なシーケンスであるためです。[a-zA-Z0-9_]re.LOCALEre.UNICODE

于 2011-12-20T00:07:21.927 に答える
21

これを行うために使用できますstr.split

s = "<alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card]\
 ...>, created=1324336085, description='Customer for My Test App',\
 livemode=False>"
val = s.split('[', 1)[1].split(']')[0]

次に、次のようになります。

>>> val
'cus_Y4o9qMEZAugtnW'
于 2011-12-20T00:07:16.100 に答える
18

これは仕事をするはずです:

re.match(r"[^[]*\[([^]]*)\]", yourstring).groups()[0]
于 2011-12-20T00:09:13.047 に答える
1

これはどう ?ファイルを使用した例:

f = open('abc.log','r')
content = f.readlines()
for line in content:
    m = re.search(r"\[(.*?)\]", line)
    print m.group(1)
    

お役に立てれば:

Magic regex : \[(.*?)\]

説明:

\[:[はメタ文字であり、文字どおりに一致させたい場合はエスケープする必要があります。

(.*?):貪欲でない方法ですべてを一致させ、それをキャプチャします。

\]:]はメタ文字であり、文字どおりに一致させたい場合はエスケープする必要があります。

于 2021-01-04T10:54:34.947 に答える