使用正则表达式从pandas df中提取字符串



我需要Python Pandas数据框架的正则表达式帮助。测试字符串将是:

s = pd.Series(['xslF345X03/was-form4_163347386959085.xml', 'xslF345X03/wf-form4_163347386959085.xmlasdf', 'xslF345/X03/wf-form4_163347386959085.xml'])

我想:

  • 从最后一个'/'开始,直到最后的'.xml'
  • 仅在字符串以'.xml'结尾时提取

所以我得到这样的东西:

xslF345X03/was-form4_163347386959085.xml      Extract: /was-form4_163347386959085.xml
xslF345X03/wf-form4_163347386959085.xmlasdf   Do not extract because the ending is not .xml
xslF345/X03/wf-form4_163347386959085.xml      Extract starting from the last '/' character: /wf-form4_163347386959085.xml

我想我需要以下熊猫代码提取使用regex:

s.str.extract(...)

谢谢你提前:-)

从最后一个'/'字符(包括/)直到.xml结束,使用str.extract(),如下:

s.str.extract(r'(/(?!.*/).*.xml)$')

Regex演示

Regex细节:

(-str.extract()捕集组启动

/- match symbol/literal

(?!.*/)-负前向正则表达式以断言在它之后没有其他符号/(即以确保符号/是最后一个))

.*-匹配0个或多个字符

.-逐字匹配点(转义以避免与regex元字符混淆)

xml- match stringxml

)-str.extract()捕集组结束

$-断言在行尾(确保.xml在行尾)

结果:

0
0  /was-form4_163347386959085.xml
1                             NaN
2   /wf-form4_163347386959085.xml

使用str.extract:

>>> s.str.extract(r'.*/(.*.xml)$')
0
0  was-form4_163347386959085.xml
1                            NaN
2   wf-form4_163347386959085.xml

您可以通过str.endswith检查,然后传递给np.where

np.where(s.str.endswith('.xml'),s.str.rsplit('/',n=1).str[-1],np.nan)
Out[99]: 
array(['was-form4_163347386959085.xml', nan,
'wf-form4_163347386959085.xml'], dtype=object)

最新更新