为了账号安全,请及时绑定邮箱和手机立即绑定

如何将正则表达式应用于数据集的所有行?

如何将正则表达式应用于数据集的所有行?

HUH函数 2023-10-26 14:37:25
我有一个数据集如下:    data = {"C1" : ['DDDSSDSSDS','SSDDDSSDDS',    'DDDDDDDDDD','SSSSSSSSSS','SSSSSSSDSS','DDDDDSDDDD','SDDDDDDDDD']}    dt = pd.DataFrame(data)    print(dt)对于每个字符串,我想获取每个“不间断 S 组”的第一个元素和最后一个元素的位置。例如,对于第一行,我有“DDD SS D SS D S ”(如您所见,我有三组 S),我最喜欢的“S 组”输出类似于[(3,5),(6,8),(9-10)]显示第一和第二的位置第一排第三个“不间断的S组”。因此输出的示例如下:           C1                         C20  DDDSSDSSDS       [(3, 5), (6, 8), (9-10)]1  SSDDDSSDDS  [(0, 2), (5, 7), (9, 10)]2  DDDDDDDDDD                         []3  SSSSSSSSSS                  [(1, 11)]4  SSSSSSSDSS          [(0, 7), (8, 10)]5  DDDDDSDDDD                   [(5, 6)]6  SDDDDDDDDD                   [(0, 1)]我当前的解决方案是:def split_it(mystring):    x = re.findall('(S*)', mystring)    if x :      return(x)dt['C2'] = dt['C1'].apply(split_it)print(dt)这会导致以下输出:0  DDDSSDSSDS  [, , , SS, , SS, , S, ]1  SSDDDSSDDS  [SS, , , , SS, , , S, ]2  DDDDDDDDDD   [, , , , , , , , , , ]3  SSSSSSSSSS           [SSSSSSSSSS, ]4  SSSSSSSDSS        [SSSSSSS, , SS, ]5  DDDDDSDDDD  [, , , , , S, , , , , ]6  SDDDDDDDDD  [S, , , , , , , , , , ]
查看完整描述

2 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

您可以使用


def split_it(mystring):

    return [(m.start(), m.end()) for m in re.finditer('S+', mystring)]

输出:


>>> dt['C1'].apply(split_it)

0    [(3, 5), (6, 8), (9, 10)]

1    [(0, 2), (5, 7), (9, 10)]

2                           []

3                    [(0, 10)]

4            [(0, 7), (8, 10)]

5                     [(5, 6)]

6                     [(0, 1)]

Name: C1, dtype: object

返回re.finditer('S+', mystring)字符串中找到的所有匹配对象,您可以通过.start()和.end()调用获取开始和结束位置。


请注意,输出中出现空匹配,因为S*匹配零个或多个 S字符,您需要使用+来匹配一个或多个.


查看完整回答
反对 回复 2023-10-26
?
九州编程

TA贡献1785条经验 获得超4个赞

您可以使用 findall 应用正则表达式:


(

    dt

    .assign(C2= lambda x: x['C1'].str.findall('S+'))

    .assign(C2= lambda x: x.apply(lambda s: [(s[0].find(item),s[0].find(item)+len(item)) for item in s[1]] ,axis=1))

)


           C1                        C2

0  DDDSSDSSDS  [(3, 5), (3, 5), (3, 4)]

1  SSDDDSSDDS  [(0, 2), (0, 2), (0, 1)]

2  DDDDDDDDDD                        []

3  SSSSSSSSSS                 [(0, 10)]

4  SSSSSSSDSS          [(0, 7), (0, 2)]

5  DDDDDSDDDD                  [(5, 6)]

6  SDDDDDDDDD                  [(0, 1)]


查看完整回答
反对 回复 2023-10-26
  • 2 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信