我想删除出现在字符串末尾的术语。例如,LTD,CORP,LLC,INC。总共有大约50个不同的术语,我想从字符串的末尾删除。
我的问题是如何删除这些术语的序列,例如字符串"COMPANY_NAME有限公司“。在这种情况下,我想同时删除CORP和LTD,即一旦LTD被删除,这个术语现在以CORP结尾,我也希望它消失。
目前,我递归地执行此操作,一遍又一遍地运行regex,直到它不再进行更改。
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)有没有比这更简单的方法,而不需要递归呢?目前,每个字符串通常需要遍历regex命令2-3次,然后才不需要进一步的调整,因此使得代码比在单个操作中执行的速度慢2到3倍。
注意:我不想删除不在字符串末尾的术语,因此我不只是使用匹配项(如r"\bLTD\b|\bCORP\b|\bLLc\b|b\INC\b" )。
发布于 2015-10-19 20:00:11
您可以通过分组和+量词来实现这一点:
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
的正则表达式匹配一个或多个组(+)
LTD或CORP或LLC或INC。
$ -字符串的末端。我们的想法是,我们匹配在字符串结束之前按顺序排列的任何space+keyword。
发布于 2015-10-19 19:59:47
意见:
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上,它的速度要快一点。
我建议你使用?:
https://stackoverflow.com/questions/33222577
复制相似问题