这是链接到我的第一个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的更好方法来执行代码?预先感谢
答案 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