2016-05-31 16 views
1

は、私はここ(良好回答)質問がありました。正規表現のpythonデータフレーム要素

現在のパターンは、これは(精度、スケール)バージョン完全例えばNUMBER(22,4)を処理

pattern = r'([^\(]+)(\(([^,]*),(.*)\))?' 

trans_field_attr = df['Data Type'].str.extract(pattern, expand=True).iloc[:, [0, 2, 3]] 

あります。残念ながら、値が1つしかない括弧内の値は選択されません。例えば

:パターンは同様にピックアップ単一の値に向上させることができる方法

0  VARCHAR2(1) 
1  VARCHAR2(1) 
2  VARCHAR2(1) 
3  VARCHAR2(1) 
4  VARCHAR2(1) 
5   DATE(7) 
6   DATE(7) 
7   DATE(7) 
8   DATE(7) 
9  VARCHAR2(1) 
10   DATE(7) 
11  VARCHAR2(3) 
12  VARCHAR2(3) 
13    NaN 
14  VARCHAR2(3) 
15  NUMBER(22,4) 

謝罪が、私は本当にpiRSquaredの答えから、さらにそれを取るのに苦労...

答えて

1

は、二番目の数字とカンマのための非キャプチャグループを追加して、以下のように、それの後?ゼロまたは1つのトークンを追加。

([^\(]+)(\(([^,]*)(?:,(.*))?\))? 
        (?: )? <= this part means that the comma and everything following it 
           is optional, alike to the ? token at the very end. 
+0

!どうもありがとう。 Regexp-fuは私の目指しているリストにあります。 –

+0

Oz123の答えを見る価値があることに注意してください。 (括弧の間に2つ以上の値が必要な場合) –

1

あなたはちょうどあなたがはるかに簡単なバージョンを使用することができ括弧の間の数字を抽出しようとしている場合:これは理想的である

In [2]: rgx=re.compile("\w+\((?P<num>\d*\,*\d*)") 
In [5]: m=rgx.match("VARCHAR(22,22)") 
In [10]: m.groupdict() 
Out[10]: {'num': '22,22'} 

In [16]: m=rgx.match("VARCHAR(22)") 
In [17]: m.groupdict()['num'] 
Out[17]: '22' 
+0

は、これは追加の解析( '.groupdict()['num])のようなものが必要だと言及する価値があるかもしれません)split('、 ')') OPは各要素を分割したい –