【问题标题】:Remove last part of string in column if strings match pattern in pandas如果字符串与熊猫中的模式匹配,则删除列中字符串的最后一部分
【发布时间】:2022-01-11 10:00:10
【问题描述】:

如果字符串与指定的模式匹配,我正在尝试删除字符串的结尾部分。

这是我正在使用的两种字符串格式:

ColA
2-OX-1011054-LWJ04-HT-01
2-VH-0611052-LWJ04-HT-001

我想从两者中删除-01-001

我知道我可以写一些东西来删除最后一个 - 之后的所有内容,但是在不同模式的那一列中有很多其他字符串,如果我这样做会搞砸。

所以如果字符串与模式完全匹配,我只想删除最后一部分。

我以前使用过类似的东西,但我不能 100% 确定它是如何工作的,但我猜它可以根据我的目的进行重构:

report['ColA'] = report['ColA'].str.replace(r'(?<=^\w{2}-\d{5}-\d{3})(-\d+)', '', regex=True)

编辑:应指定并非所有结束编号都是01001。它可以是从000999 的任意数字

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:
    report['ColA'] = report['ColA'].str.replace(r'(?<=^\d{1}-\w{2}-\d{7}-\w{3}\d{2}-\w{2})(-\d+)', '', regex=True)
    

    【讨论】:

    • 您可以省略 (-\d+) 中的捕获组,因为您已经使用了后向断言。
    【解决方案2】:

    试试

    report['ColA'] = report['ColA'].str.replace(r'-0{1,2}1', '', regex=True)
    
    

    它仅适用于-01-001。是你想要的吗?
    编辑
    如果是任何数字,这应该可以工作

    report['ColA'] = report['ColA'].str.replace(r'-\d+$', '', regex=True)
    

    【讨论】:

      【解决方案3】:

      “不同模式的那一列中还有很多其他字符串”

      你可以使用:

      report['ColA'] = report['ColA'].str.replace(r'^(\d+-[A-Z]{2}-\d{7}-[A-Z]{3}\d\d-[A-Z]{2})-\d{1,3}$', r'\1', regex=True)
      

      模式^(\d+-[A-Z]{2}-\d{7}-[A-Z]{3}\d\d-[A-Z]{2})-\d{1,3}$表示:

      • ^ - 起跑线锚点;
      • ( - 打开第一个捕获组;
        • \d+ - 1+ 位(如果您确定这始终只是一个数字,请删除“+”);
        • -[A-Z]{2} - 一个连字符后跟两个大写字母字符;
        • -\d{7} - 一个连字符后跟 7 位数字;
        • -[A-Z]{3}\d\d - 一个连字符,后跟三个大写字母字符和两个数字;
        • -[A-Z]{2} - 文字连字符后跟两个大写字母字符;
        • ) - 关闭第一个捕获组;
      • -\d{1,3} - 连字符后跟一到三位数字;
      • $ - 终点线锚。

      我们使用第一个捕获组的内容来替换整个(匹配的)字符串。通过这种方式,您已验证您仅在需要时替换这些数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-02
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 2017-07-06
        • 1970-01-01
        相关资源
        最近更新 更多