2017-01-04 6 views
2

は、Pythonのコードを考えてみましょう:正規表現 - d +に特定の数字を含める必要がありますか?

import re 

re.findall('[0-9]+', 'XYZ 102 1030') 

返す:

['102', '1030'] 

を1が数字3の少なくとも一つのoccuranceを必要とする正規表現を書くことができ、すなわち私がそこにある'[0-9]+'に興味を持っています少なくとも1つ3?だから、関心の結果は次のようになります。

['1030'] 

より一般的には、どのように3少なくともnについて年代?

また、より一般的には、少なくともn3と少なくともk4などです。あなたは数3内部(少なくとも)2回を探している場合は、文字列で

+0

をしたいですか?例えば、 'foo3bar'は3を含みます。あなたはそれにマッチしたいですか? – ThisSuitIsBlackNot

+0

答えがあなたの問題を解決しましたか?あなたはそれらのいずれにもコメントしていません... – joanolo

答えて

2

少なくとも1 3

\d*3\d* 

https://regex101.com/r/yEbatk/4

可能性があり、あなたが使用できます。

\d*3\d*3\d* 

https://regex101.com/r/yEbatk/5

あなたはそれはあなたが{min,max} repeat optionを使用することができn回(少なくとも)にしたい場合:

\d*(3\d*){n} 

https://regex101.com/r/yEbatk/7

+1

@aragaer、あなたは正しいです。私はちょうどjoanoloの答えをupvoted :)私は答えを更新することができます... – Dekel

+0

@aragaer:最後の例の最後に '\ d *'を保存することもできます。それはすでに括弧内に入っています。 – joanolo

+1

@joanolo私は答えが今より良いと思う。 – Dekel

2

わずか3に続く「0桁以上の数字を意味し、正規表現'\d*3\d*'を、してみてください、その後に0桁またはそれ以上の数字が続きます。 "少なくとも 'n' は3"

あなたはcheck it here

することができますあなたがしたい場合は、'\d*(3\d*){n}'を使用しています。

+1

グループ( '[3]')を使っていないという私の投票があった。 – Dekel

1

xN出現、メートルy発生など、この一般式に記載の構築について:先読み部(?=(?:\d*x){n})がそれぞれ所望nxに対して繰り返される

(?=(?:\d*x){n})(?=(?:\d*y){m})\b\d+\b 

私は、先読みグループを非キャプチャであることを(?:..)で囲んで非キャプチャすることを選択しましたが、それは少し読みにくくなりました。

カウント部自体は(\d*x){n}であり、検索する番号が複数ある場合は数字が任意の順序で表示されるため、先読みが必要です。

最終\b\d+\bは「ない単語」文字に囲まれて、あなただけの数字をキャプチャ確保し、それは文字を含む任意のシーケンスを飛ばしたがabc-123-456のようなものになります作業します。

例:XYZ 1023344a 1403403

(?=(?:\d*3){2})(?=(?:\d*4){2})\b\d+\b 

中2 3の2〜4のは、1403403なく1023344a一致します。あなたはこのために正規表現を使用できますが

https://regex101.com/r/QgYptp/3

1

参照してください、正規表現を使用すると、異なる桁以上のカップルを探している時に読み厄介とハードを取得します。代わりに、文字列の各文字の出現回数をカウントするcollections.Counterを使用することができます。

from collections import Counter 

# Must contain at least two 3s, three 4s, and one 7 
mins = { '3': 2, '4': 3, '7': 1 } 

input = '3444 33447 334447 foo334447 473443 2317349414' 
tokens = input.split() 

for token in tokens: 
    # Skip tokens that aren't numbers 
    if not token.isdigit(): 
     continue 

    counter = Counter(token) 

    for digit, min_count in mins.items(): 
     if counter[digit] < min_count: 
      break 
    else: 
     print(token) 

出力:あなただけのすべての桁の数字のトークンを一致させるために

334447 
473443 
2317349414 
関連する問題