2017-08-29 17 views
1

の桁で終わる必要があります。正規表現は文字で始まり、私のpythonを使用して文字列パターンを抽出しようとしているのpython

  1. は大文字「C」

  2. 中央部で開始する必要があります。含めることができます/

  3. 必見は、1つまたは2つの数字で終わる

例の文字列:

193 skol C/12 
334 skol C/6 
577 skol C12 
345 skol C6 

期待されるマッチング結果は次のようになります。

C/12 
C/6 
C12 
C6 

これは私の正規表現は、次のようになります。

df['a'].str.extract('^[C]\/?\d{1,2}$') 

しかし、それは期待される結果を生成しません。 。私は正規表現に "[]"を追加しようとしましたが、それでも動作しません:(誰でも私にいくつかの提案をお願いしますか?本当にありがとう!

+1

あなたは使用することができます:? 'R '\ BC/\ dは{1,2} \ – anubhava

+0

b''それはあなたにも一致しようとしているように見えるのラインスタートとエンドの-ライン。しかし、あなたのラインの開始位置は "C"の直前にはありません。おそらくあなたの試合から^と$を取り除いてみてください。 – depwl9992

+0

@ depwl9992あなたの提案をありがとう、それは動作します! – QianLi

答えて

1

あなたは

C\/?\d{1,2} 

正規表現を使用することができ、それが動作する理由regex demo

2

これを試してください:

\C(\/|)\d{1,2}$ 

\Cを - キャッチリテラル上側C
(/\|) - 末端または二つの数にキャッチ

-
\d{1,2}$(後には一致してパイプsimbol)リテラル /またはnoneキャッチ

コード:

df['a'].str.extract(r'\C(\/|)\d{1,2}$') 
+0

バックスラッシュが 'C'をエスケープする理由とパイプの代わりに' \ /? 'だけを使うのはなぜですか? –

+0

などがあるので、 'C6'' C \ 12'のようにバックスラッシュを捕まえる必要があります。したがって、空のパイプを持つ空のグループにはバックスラッシュまたはnoneが返されます。 – Abe

0
import pandas as pd  
a = pd.Series(['193 skol C/12','334 skol C/6','577 skol C12','345 skol C6']) 

a.str.extract('(C\/?\d+)') 
0 C/12 
1  C/6 
2  C12 
3  C6 

を参照してください。

(グループ#1のキャプチャ。複数のトークンをまとめてグループ化し、部分文字列を抽出するか、または逆参照を使用するための取得グルー​​プを作成します。

C文字。 "C"文字に一致します(charコード67)。

/エスケープ文字。 "/"文字に一致します(charコード47)。

?オプション。直前のトークンの0と1の間にマッチします。

\ d数字。任意の数字文字(0〜9)に一致します。

+プラス。前のトークンの1つ以上と一致する。

関連する問題