web-dev-qa-db-ja.com

Python正規表現によるデータの抽出

Python正規表現で特定の値を抽出するための正規表現を思い付くために、頭を抱え込むのに問題があります。

解析しようとしているページには、次の形式で表示される多数のproductIdがあります

\"productId\":\"111111\"

すべての値を抽出する必要があります、111111 この場合。

12
greyfox
t = "\"productId\":\"111111\""
m = re.match("\W*productId[^:]*:\D*(\d+)", t)
if m:
    print m.group(1)

word以外の文字(\W*)、次にproductIdの後に列以外の文字([^:]*)と:。次に、非数字(\D*)と一致し、次の数字をキャプチャします((\d+))。

出力

111111
21
perreal

このようなもの:

In [13]: s=r'\"productId\":\"111111\"'

In [14]: print s
\"productId\":\"111111\"

In [15]: import re

In [16]: re.findall(r'\d+', s)
Out[16]: ['111111']
10
Fredrik Pihl

ここでのバックスラッシュは、(raw以外の)Python文字列と正規表現構文の両方でエスケープ文字として使用されるため、混乱を招く可能性があります。

これにより、投稿したフォーマットから製品IDが抽出されます。

_re_prodId = re.compile(r'\\"productId\\":\\"([^"]+)\\"')
_

生の文字列_r'...'_は、1レベルのバックスラッシュエスケープを取り除きます。文字列区切り文字として一重引用符を使用すると、二重引用符をエスケープする必要がなくなります。そして最後に、正規表現言語での特別な意味のために、バックスラッシュは2回(1回だけ)になります。

Regexpオブジェクトのfindall()メソッドを使用して、テキスト内のすべての一致を検索できます。

_re_prodId.findall(text_to_search)
_

これにより、すべての製品IDのリストが返されます。

1
Tobia

これを試して、

 :\\"(\d*)\\"

これがあなたの望むことをしないなら、あなたのデータのより多くの例を挙げてください。

0
frickskit