簡體   English   中英

如果字符串與 pandas 中的模式匹配,則刪除列中字符串的最后一部分

[英]Remove last part of string in column if strings match pattern in pandas

如果字符串與指定的模式匹配,我正在嘗試刪除字符串的結尾部分。

這些是我正在使用的兩種字符串格式:

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的任何數字

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

嘗試

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)

str.rsplit從右側拆分如何,但使用 boolean 掩碼來決定刪除哪個以及保留哪個?

splits = report['ColA'].str.rsplit('-', 1)
mask = splits.str[-1].isin(['01','001'])
report.loc[mask, 'ColA'] = splits[mask].str[0]

Output:

                    ColA
0  2-OX-1011054-LWJ04-HT
1  2-VH-0611052-LWJ04-HT

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

您可以使用:

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+-[AZ]{2}-\d{7}-[AZ]{3}\d\d-[AZ]{2})-\d{1,3}$表示:

  • ^ - 起跑線錨;
  • ( - 打開第一個捕獲組;
    • \d+ - 1+ 位(如果您確定這將始終只是一個數字,請刪除“+”);
    • -[AZ]{2} - 文字連字符后跟兩個大寫字母字符;
    • -\d{7} - 一個連字符后跟 7 位數字;
    • -[AZ]{3}\d\d - 文字連字符后跟三個大寫字母字符和兩個數字;
    • -[AZ]{2} - 文字連字符后跟兩個大寫字母字符;
    • ) - 關閉第一個捕獲組;
  • -\d{1,3} - 一個連字符,后跟一到三位數字;
  • $ - 結束線錨。

我們使用第一個捕獲組的內容來替換整個(匹配的)字符串。 通過這種方式,您已驗證您僅在需要時替換那些數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM