2017-08-29 277 views
1

数字我想使用Python提取字符串模式结束:正则表达式,必须以字母开头,并与蟒蛇

  1. 必须以大写字母“C”

  2. 中间部分开始可以包含/

  3. 必须使用一个或两个数字结束

个例字符串:

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} \ b'' – anubhava

+0

它看起来像你还试图匹配开始的行和结束-线。但是你的起始位置没有一个直接出现在“C”之前。也许尝试从你的比赛中删除^和$? – depwl9992

+0

@ depwl9992感谢您的建议,它的工作原理! – QianLi

回答

2

尝试这种情况:

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

\C - 抓住字面上方C
(/\|) - 抓住字面/或无(管辛博尔与后没有匹配)
\d{1,2}$ - 捕捉上或两个数字在端

代码:

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

为什么反斜杠转义'C',为什么不使用'\ /?'而不是管道? –

+0

,因为有一些匹配,所以需要捕获反斜杠,或者不要,例如'C6''C \ 12'。因此,空管组的空组将得到反斜杠或无。 – 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”字符(字符代码67)。

/Escaped character。匹配“/”字符(char代码47)。

?可选的。匹配前一个标记的0和1之间的值。

\ d Digit。匹配任何数字字符(0-9)。

+ Plus。匹配1个或更多前面的标记。