我有像下面这样的python字符串
"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作为输出。它在最后一个_之后,在第一个.之前,我们也在第一个.之后获得关键字。
所以,我试了下
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字符之前和之后获得关键字
GHI
PQRST.GHI
JKLMN.OPQ
WXY.TUV发布于 2022-09-29 14:00:58
尝试(regex101):
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))指纹:
ABCDEF.GHI
PQRST.GHI
JKLMN.OPQ
WXY.TUV发布于 2022-09-29 14:00:26
您可以这样做(尝试模式这里 )
df['text'].str.extract('_([^._]+\.[^.]+)',expand=False)输出:
0 ABCDEF.GHI
1 PQRST.GHI
2 JKLMN.OPQ
3 WXY.TUV
Name: text, dtype: object发布于 2022-09-29 14:03:08
您也可以使用rsplit()来完成它。指定maxsplit,这样您的拆分不会超出您的需要(为了提高效率):
[s.rsplit('_', maxsplit=1)[1].rsplit('.', maxsplit=1)[0] for s in strings]
# ['GHI', 'PQRST.GHI', 'JKLMN.OPQ', 'WXY.TUV']如果有少于2个点的字符串,并且每个返回的字符串中应该有一个点,那么添加一个三元操作符,根据字符串中的点数来拆分(或不分割)。
[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']https://stackoverflow.com/questions/73896757
复制相似问题