使用熊猫执行向左搜索功能

时间:2020-11-07 13:08:29

标签: excel regex pandas

这是链接到我的第一个Python项目的第一个问题。 简而言之,我在Excel中有2列这样的数据(前6行):

destination_area   |   destination_code
SG37.D0            |   SG37.D
SG30.C0            |   SG30.C
SG4.A3.P           |   SG4.A
SG15.C16           |   SG15.C
SG35.D02           |   SG35.D
SG8.A5.BC          |   SG8.A

因此,在Excel中,我正在使用一个函数来查找第一个“”来获取目标代码。在单元格中,并返回其左侧的所有字符,再加上1个字符:

=IfError(left(E2,search(".",E2)+1),"")

现在我想使用str.extract来执行

df1['destination_code'] = df1['destination_area'].str.extract(r"(?=(.*[0-9][.][A-Z]))", expand = False)  

print(df1['destination_area'].head(6),df1['destination_code'].head(6))

我几乎满足了我的需求,但是代码仍然可以识别出那些具有超过1个“。”的字符。

destination_area   |   destination_code
SG37.D0            |   SG37.D
SG30.C0            |   SG30.C
SG4.A3.P           |   SG4.A3.P
SG15.C16           |   SG15.C
SG35.D02           |   SG35.D
SG8.A5.BC          |   SG8.A5.BC

我知道我的正则表达式正在理解{a number +“。 +一个字母},返回“ SG4.A3.P”和“ SG8.A5.BC”情况下的所有字符。 那么如何修改我的代码?还是执行Excel的更好方法来执行代码?预先感谢

1 个答案:

答案 0 :(得分:2)

无需提前。使用

df1['destination_code'] = df1['destination_area'].str.extract(r"^([^.]+\..)", expand=False)  

请参见proof。注意捕获组,在这里足以返回您需要的值。

说明

--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    [^.]+                    any character except: '.' (1 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \.                       '.'
--------------------------------------------------------------------------------
    .                        any character except \n
--------------------------------------------------------------------------------
  )                        end of \1