首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫从第一次出现的性格中向前看和后面看

熊猫从第一次出现的性格中向前看和后面看
EN

Stack Overflow用户
提问于 2022-09-29 13:56:08
回答 3查看 60关注 0票数 3

我有像下面这样的python字符串

代码语言:javascript
运行
复制
"1234_4534_41247612_2462184_2131_GHI.xlsx"
"1234_4534__sfhaksj_DHJKhd_hJD_41247612_2462184_2131_PQRST.GHI.xlsx"
"12JSAF34_45aAF34__sfhaksj_DHJKhd_hJD_41247612_2f462184_2131_JKLMN.OPQ.xlsx"
"1234_4534__sfhaksj_DHJKhd_hJD_41FA247612_2462184_2131_WXY.TUV.xlsx"

我想做以下几件事

( a)提取第一个点前后出现的字符。

( b)我想要的关键字总是在最后一个_符号之后找到的

对于示例:如果您查看第二个输入字符串,我希望只获得PQRST.GHI作为输出。它在最后一个_之后,在第一个.之前,我们也在第一个.之后获得关键字。

所以,我试了下

代码语言:javascript
运行
复制
for s in strings:
   after_part = (s.split('.')[1])
   before_part = (s.split('.')[0])
   before_part = qnd_part.split('_')[-1]
   expected_keyword = before_part + "." + after_part
   print(expected_keyword)

虽然这样做很有效,但这绝对不是编写正则表达式的好方法。

还有其他更好的方式来写这个吗?

我希望我的输出如下所示。如您所见,我们在第一个dot字符之前和之后获得关键字

代码语言:javascript
运行
复制
GHI
PQRST.GHI
JKLMN.OPQ
WXY.TUV
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-09-29 14:00:58

尝试(regex101):

代码语言:javascript
运行
复制
import re

strings = [
    "1234_4534_41247612_2462184_2131_ABCDEF.GHI.xlsx",
    "1234_4534__sfhaksj_DHJKhd_hJD_41247612_2462184_2131_PQRST.GHI.xlsx",
    "12JSAF34_45aAF34__sfhaksj_DHJKhd_hJD_41247612_2f462184_2131_JKLMN.OPQ.xlsx",
    "1234_4534__sfhaksj_DHJKhd_hJD_41FA247612_2462184_2131_WXY.TUV.xlsx",
]

pat = re.compile(r"[^.]+_([^.]+\.[^.]+)")

for s in strings:
    print(pat.search(s).group(1))

指纹:

代码语言:javascript
运行
复制
ABCDEF.GHI
PQRST.GHI
JKLMN.OPQ
WXY.TUV
票数 2
EN

Stack Overflow用户

发布于 2022-09-29 14:00:26

您可以这样做(尝试模式这里 )

代码语言:javascript
运行
复制
df['text'].str.extract('_([^._]+\.[^.]+)',expand=False)

输出:

代码语言:javascript
运行
复制
0    ABCDEF.GHI
1     PQRST.GHI
2     JKLMN.OPQ
3       WXY.TUV
Name: text, dtype: object
票数 2
EN

Stack Overflow用户

发布于 2022-09-29 14:03:08

您也可以使用rsplit()来完成它。指定maxsplit,这样您的拆分不会超出您的需要(为了提高效率):

代码语言:javascript
运行
复制
[s.rsplit('_', maxsplit=1)[1].rsplit('.', maxsplit=1)[0] for s in strings]
# ['GHI', 'PQRST.GHI', 'JKLMN.OPQ', 'WXY.TUV']

如果有少于2个点的字符串,并且每个返回的字符串中应该有一个点,那么添加一个三元操作符,根据字符串中的点数来拆分(或不分割)。

代码语言:javascript
运行
复制
[x.rsplit('.', maxsplit=1)[0] if x.count('.') > 1 else x 
 for s in strings
 for x in [s.rsplit('_', maxsplit=1)[1]]]

# ['GHI.xlsx', 'PQRST.GHI', 'JKLMN.OPQ', 'WXY.TUV']
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73896757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档