2012-03-27 24 views
0

私は非常に具体的な課題があります。私はコマンドライン文字列を解析しており、特定のパターンの数字以外のすべてを取り除く必要があります。例:Python: r nを含む文字列から文字を取り除く

str = 'abd-256PA\r\n20db' 

私はその番号20を取得したい!これはどうすればいいですか?数字が'abc-256\r\n0db'のように1桁の数字になることがあります。文字列に必ず'\r\n'が含まれているとは限りません。

私は成功せずrstriplstripstrip[:]といくつか他のものを試してみました。

+0

検索しようとしているパターンは何ですか? – Abhijit

+1

このサイトは特定の*課題*についてではなく、具体的な*質問*について...あなたがこれまでに書いた(機能していない可能性のある)コードをいくつか提供してください。 –

+1

正規表現(reモジュール)を使用 – pylover

答えて

1

あなたの表現は、常に「DB」で終わる場合、試してみてください。

import re 
d = "abd-256PA\r\n20db" 
s = re.search("\d{1,2}db",d) 
print d[s.start():s.end()-2] 
+0

ええと私はいつもdbで終わると思う。これは機能するかもしれません。 – DavidScott612

+0

だけでなく、私はちょうど(分割線を使って、それを考え出したと思います)このような : STR = "ABC123 \ rを\ n63db" トン= str.splitlines() T2 = t.rstrip( 'DB') – DavidScott612

+0

はい、正規表現は普通の方法ですが、splitlines()を使うよりも速くて安全です – pylover

1

をあなたはこれを試すことができます。

str.replace('\n','').replace('\r','').replace('abc-256','').replace('abd-256','').replace('PA','').replace('db','') 

それはあなたが説明した2例のために働く...それはちょうど、すべての置き換え空の文字列で無駄な情報の断片。

更新:

あなたがわからない場合は、文字列がされると、あなただけの数の後に接尾辞「DB」、そしてあなたは、この正規表現を試すことができますがありますしたいことを知っている何を:

import re 
regex=re.compile("([0-9]+)db") 
str="abd-256PA\r\n20db" 
parsed_number = regex.findall(str)[0] 
print parsed_number 
+0

文字列が何であるか分かりません。それは私には盲目です。 – DavidScott612

+0

ok、私の更新された私の答えを見て、それは今役立つかもしれません。 –

3

あなたが求める数は、文字列の末尾に常にある場合は、正規表現のこの種でそれを取得することができます:([0-9]+)[^0-9]*$

プログラム例:

import re 
print re.search(r'([0-9]+)[^0-9]*$','abd-256PA\r\n20db').group(1) 

出力例:

20 

テストプログラム:

import re 

str = ['abd-256PA\r\n20db', 
     'abc-256\r\n0db', 
     'abc-256aa0db', 
     'uio1289248282dasd1786ddass', 
     '12', 
     '2101a123aasdqwqwe'] 

for x in str: 
    print '"%s" >> "%s"' %(x, re.search(r'([0-9]+)[^0-9]*$',x).group(1)) 

テスト出力:

"abd-256PA 
20db" >> "20" 
"abc-256 
0db" >> "0" 
"abc-256aa0db" >> "0" 
"uio1289248282dasd1786ddass" >> "1786" 
"12" >> "12" 
"2101a123aasdqwqwe" >> "123" 

要求によって説明:

Pythonにはsearchという名前の正規表現モジュールreがあり、与えられた文字列内の正規表現の一致を検索しようとします。

基本的に、これは何([0-9]+)[^0-9]*$平均である:

  • [0-9]任意の数の0から9
  • [0-9]+ 1または0から9
  • [^0-9]に任意の数のより多くのoccurance任意の文字BUT番号0〜 〜9
  • [^0-9]* 0〜9の数字がない0文字以上のシーケンス
  • 01グループ、我々は
  • ([0-9]+)[^0-9]*$文字列
の終わりに続いて0以上の非数字が続く1つの以上の数字の列を見つけようとしているものをキャプチャする文字列
  • (...)の終了

    関数re.searchは2つのパラメータを取ります:正規表現とその正規表現を検索する文字列です。そして、タイプMatchObjectのオブジェクトを返します。基本的にはgroup(1)は「私に最初に捕まえたグループを教えてください」((...)のもの)を意味します。

  • +0

    これは非常に複雑に見えます! – DavidScott612

    +0

    @ DavidScott612 'Example program'の部分だけを見てください。残りは、異なるケースをテストするテストプログラムです。あなたは最初の2行のプログラムでうまくいくでしょう。 – bezmax

    +0

    コマンドラインを解析しているときに文字列がわからない場合は、re.search変数の2番目の引数を変数にしますか? re.search(r '([0-9] +)[^ 0-9] * $'、mystr).group(1)と同様です。 group(1)関数とは何ですか? ....私の無知には申し訳ありません。 – DavidScott612

    関連する問題