2015-10-19 17 views
3

我想刪除出現在字符串末尾的字詞。例如,LTD,CORP,LLC, INC[總共有大約50個左右的不同術語,我想從字符串末尾移除]。如何避免需要遞歸地使用正則表達式來刪除字符串末尾的單詞?

我的問題與如何刪除這些術語的序列,例如與字符串「COMPANY_NAME CORP LTD」。在這種情況下,我想刪除CORPLTD [即一旦LTD已被刪除,這個詞現在終止於CORP,我也想去]。

目前,我是遞歸地執行此操作,一遍又一遍地運行正則表達式,直到它不再進行更改。

import re 

def re_run_match(match_term, replace_with, string): 
    new_string_temp = re.subn(match_term, replace_with, string) 
    if new_string_temp[1] == 0: 
     return(new_string_temp[0]) 
    else: 
     return(re_run_match(match_term, replace_with, new_string_temp[0])) 

long_match_set = r" LTD$| CORP$| LLC$| INC$" 
company_name = "COMPANY_NAME CORP LTD" 
clean_company_name = re_run_match(long_match_set, "", company_name) 

是否有一種比這更簡單的方法,而不需要遞歸?目前,每個字符串都需要經過2-3次正則表達式才能不需要進一步的調整,因此使代碼比單次操作的方式慢2到3倍。

注意:我不想刪除不在字符串末尾的字詞,因此我不僅僅使用匹配字詞,如r"\bLTD\b|\bCORP\b|\bLLc\b|b\INC\b"

+3

嘗試['(?:(?:LTD | CORP | LLC | INC))+ $'](https://regex101.com/r/dG8iN9/1)正則表達式。 –

+0

@stribizhev @stribizhev - 謝謝,認爲這是完美的 - 只是運行數據現在:-) – kyrenia

+1

好極了,我終於讓我的兒子睡覺了,並且發佈了答案:) –

回答

5

你可以用分組實現它和+量詞:

import re 
long_match_set = r"(?: (?:LTD|CORP|LLC|INC))+$" 
company_name = "COMPANY_NAME CORP LTD" 
clean_company_name = re.sub(long_match_set, "", company_name) 
print(clean_company_name) 

IDEONE demo

正則表達式匹配1個或多個組(+)的

  • 一個空間和替代組包括
    • LTDCORPLLCINC或前
  • $ - 字符串的結尾。

這個想法是我們匹配任何位於字符串結尾之前的序列中的任何space + keyword

-2

觀察:

In [1]: import re 

In [2]: %timeit re.compile('((ltd|corp|llc|inc))+$', re.IGNORECASE).sub('', 'COMPANY_NAME CORP LTD') 
100000 loops, best of 3: 2.51 µs per loop 

In [3]: %timeit re.compile('(?: (?:ltd|corp|llc|inc))+$', re.IGNORECASE).sub('', 'COMPANY_NAME CORP LTD') 
100000 loops, best of 3: 2.48 µs per loop 

?:更快但不是很多,同時忽略大小寫。

In [4]: %timeit re.compile('(?: (?:ltd|corp|llc|inc))+$').sub('', 'COMPANY_NAME CORP LTD') 
100000 loops, best of 3: 2.03 µs per loop 

In [5]: %timeit re.compile('((ltd|corp|llc|inc))+$').sub('', 'COMPANY_NAME CORP LTD') 
100000 loops, best of 3: 2.2 µs per loop 

忽略大小寫敏感性,它更快。

In [6]: %timeit re.compile('((ltd|corp|llc|inc))+$').sub('', 'COMPANY_NAME CORP LTD wont match') 
100000 loops, best of 3: 2.61 µs per loop 

In [7]: %timeit re.compile('(?: (?:ltd|corp|llc|inc))+$').sub('', 'COMPANY_NAME CORP LTD wont match') 
100000 loops, best of 3: 2.58 µs per loop 

而在NO MATCH其快一點。

我在這裏的建議你使用?:

+0

@nhahtdh:你們是對的,那是一個錯字,我跑了。我改正了我的答案 –

相關問題