簡體   English   中英

如何刪除字符串中最后一個數字之后的所有內容(某些字符除外)

[英]How to remove everything (except certain characters) after the last number in a string

這是此問題的后續措施

我在那里學習了如何刪除字符串中最后一個數字之后的所有字符; 所以我可以轉

w = 'w123 o456 t789-- --'

進入

w123 o456 t789

現在我可能會有這樣的字符串:

w = 'w123 o456 (t789)'

在這種情況下,

re.sub(r'\D+$', '', w)

會給我

w123 o456 (t789

因此,我實際上有兩個密切相關的問題:

1)如何以保留某些字符(例如括號)的方式修改命令re.sub(r'\\D+$', '', w) )?

2)如何修改命令re.sub(r'\\D+$', '', w)以便僅刪除某些字符(例如破折號和空格)?

編輯

@Martin Bonner的答案非常接近,但例如

w='w123 -o456 t789--) --'

命令

 re.sub('[- ]+$', '', w)

給我w123 -o456 t789--)但它也應該消除剩余的破折號。

要保留某些字符()使用:

re.sub('[^0-9()]+$', '', w)

從行尾僅刪除某些字符:

re.sub('[- ]+$', '', w)

在方括號中,您可以列出要匹配的字符。 如果第一個字符是^則匹配指定字符以外的所有字符。 唯一的小麻煩是-通常指定一個范圍(因此,我們可以指定所有數字,而不必列出所有10個數字)。 這意味着,如果我們要指定-作為要匹配的字符之一,則需要先輸入- (如果要指定^ ,請使用\\對其進行轉義,然后返回原始字符串。)

從評論中,我認為您實際上的意思是第二個挑戰是“刪除字符串中位於最后一位和行尾之間的所有破折號和空格”。 使用正則表達式可能是可行的,但是會在三個月的時間內回來維護代碼的人會討厭您(很可能是您)。 只要記住傑米·扎溫斯基的話:

有些人遇到問題時會想:“我知道,我將使用正則表達式。”現在,他們有兩個問題。

您可以在回調中使用另一個re.sub作為替換模式。

re.sub(r'\D+$', lambda m: re.sub(r'[^()]+','',m.group(0)), s)

在這里,您將匹配字符串末尾除數字以外的所有符號,將該值傳遞給回調,並且除()以外的所有其他符號將從該值中刪除。

如果總是有3組字符,並且每組以一個字母開頭,然后是3位數字,並且只有最后一組可能帶有方括號,則此表達式可能正是您所需要的:

w = 'w123 o456 (t789)'
clean = re.sub(r'^.*(\w\d{3})[ -]+(\w\d{3})[ -]+(\(?\w\d{3}\)?).*$', r'\1 \2 \3', w)

即使字符串的開頭或結尾還有其他一些字符, clean現在'w123 o456 (t789)'打印'w123 o456 (t789)'

該表達式查找3個字符組,每個字符組由一個字母和3個數字組成。 對於最后一組,有可選的括號- \\(?\\)? 3組之前和之后的所有字符都與^.*.*$匹配。 然后,我們只用三個捕獲的組替換所有內容- \\1 \\2 \\3

為什么不使用正則表達式,而不使用正則表達式(如果您不希望某些字母或數字,那么此自動保留字母和數字,我們也可以更改它):

w = 'w123 o456 t789-- --'
list_to_keep =[' ']
print(''.join([x for x in w if x.isalnum() or x in list_to_keep]))
>> w123 o456 t789 

w = 'w123 o456 (t789)'
list_to_keep =[' '] # add to me
print(''.join([x for x in w if x.isalnum() or x in list_to_keep]))
>> w123 o456 t789 

例如:

w = 'w123 o456 (t789)'
list_to_keep =[' ', '('] # add to me (I added '(' to keep for example)
print(''.join([x for x in w if x.isalnum() or x in list_to_keep]))
>> w123 o456 (t789

它與您編輯的“馬丁不起作用”的內容背道而馳:

w='w123 -o456 t789--) --'
list_to_keep =[' '] # add to me (I added '(' to keep for example)
print(''.join([x for x in w if x.isalnum() or x in list_to_keep]))
>> w123 o456 t789

暫無
暫無

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

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