2016-12-30 11 views
1

を私はludocid後の数だけ連続した数字を取得したいこのdsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2は、マッチング停止 - Pythonの27

のような巨大な文字列を持っています。

私はこの正規表現を試しました(ludocid).*(?=\d+\d+)と多くの運がありません。

答えて

2

に見えます...のはそれを介して動作してみましょう。

まず、これが正しい正規表現である:ludocid.(\d+)

(あなたが道で、re.searchの代わりre.matchとそれを使用したいと思うマッチ全体文字列にマッチする正規表現が必要です。)


しかし、あなたのことを見て、何が間違っているのか、正しい正規表現に到達する方法を見てみましょう。

(ludocid).*(?=\d+\d+)

関数として正規表現を想像してみてください。正しいものを渡すと、適切な結果が得られます。あなたがかっこで物を包むとき、あなたは「これを見つけてそれを私に返す」と言っています。 ludocidが返って来る必要はありません、私は推測しています...そのような括弧を削除します。

ludocid.*(?=\d+\d+)

今、あなたは.*を持っています。これは正規表現では危険です。文字通り「できるだけ多くのものを掴んでください!"しばしば私は非欲張りのバージョン(.*?)を使用していますが、このケースではただ一つの余分な文字があると思われます。文字通りの文字を知っていればそれを使うことができますが、それは言う.、とあなたは「1桁以上のシーケンスを探す言う\d+\d+を、持っている。のは、括弧内手放す今

ludocid.(?=\d+\d+)

を「任意の1つの文字をつかむ」、そして見つけますこれは、「2桁以上のシーケンスを見つける」と同じです。私はこれがあなたが望んだものではないと思います。(とにかく問題を説明した方法ではありません)

ludocid.(?=\d+)

大丈夫です。今... (?=...)は何ですか?これは、先読みアサーションと呼ばれています。それは "この文字列を見つけたら、はその前のものと一致します" ...一致する次の場合

(?=...)

一致しますが、文字列のいずれかを消費しません:the Python 2.7 documentationで与えられた例があります。これは先読みアサーションと呼ばれます。たとえば、Isaac (?=Asimov)は、'Asimov'の後にのみ'Isaac 'と一致します。

これは、正規表現がでないことを意味します。は数字を返します。代わりに、数字が存在するかどうかを調べ、正規表現の残りの部分を返します。先読みアサーションを削除し、我々はそこにいる:

ludocid.(\d+)

あなたはre.searchでこれを使用すると、あなたが欲しいのグループ取得します:

>>> s = "dsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2" 
>>> import re 
>>> re.search(r"ludocid.(\d+)", s).group(1) 
'15878284988193842600' 
3

あなたはludocid=(\d+)を試すことができます。

s = "dsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2" 

import re 
re.findall(r"ludocid=(\d+)", s) 
# ['15878284988193842600'] 
3

あなたは、この正規表現を使用することができます。これは、0以上の非数字が続くと、それludocidリテラルにマッチします

ludocid\D*(\d+) 

RegEx Demo

を捕捉されたグループ#1の1桁以上の数字に一致します

コード:だから

(?<=ludocid=)(\d+) 

>>> s = 'dsdasdludocid=15878284988193842600#lrd=0x3be04dcc5b5ac513:0xdc5b0011ebb625a8,2' 
>>> print re.search(r'ludocid\D*(\d+)', s).group(1) 
15878284988193842600 
1

従うだけの数字を一致させるためには、最初の非数値文字で停止し、後ろに正の外観をしてみてください

re.findall(r"(?<=ludocid=)(\d+)", s) 

ポジティブルックバックは、あなたが望むものを探し、 'flag'文字列が先行する場合にのみ一致します。

**注:**あなたはこのように、第2 =記号をエスケープする必要があるかもしれません:あなたはちょうど一緒に正規表現ビットの束を投げたよう(?<=ludocid\=)(\d+)

関連する問題