我需要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)