首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免递归地使用regex删除字符串末尾的单词?

如何避免递归地使用regex删除字符串末尾的单词?
EN

Stack Overflow用户
提问于 2015-10-19 19:41:44
回答 2查看 297关注 0票数 3

我想删除出现在字符串末尾的术语。例如,LTDCORPLLCINC。总共有大约50个不同的术语,我想从字符串的末尾删除。

我的问题是如何删除这些术语的序列,例如字符串"COMPANY_NAME有限公司“。在这种情况下,我想同时删除CORPLTD,即一旦LTD被删除,这个术语现在以CORP结尾,我也希望它消失。

目前,我递归地执行此操作,一遍又一遍地运行regex,直到它不再进行更改。

代码语言:javascript
复制
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" )。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-19 20:00:11

您可以通过分组和+量词来实现这一点:

代码语言:javascript
复制
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

的正则表达式匹配一个或多个组(+)

  • 一个空间和一个可选组,包括
    • 对象之前的LTDCORPLLCINC

  • $ -字符串的末端。

我们的想法是,我们匹配在字符串结束之前按顺序排列的任何space+keyword

票数 5
EN

Stack Overflow用户

发布于 2015-10-19 19:59:47

意见:

代码语言:javascript
复制
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

?:速度更快,但忽略大小写敏感性并不大。

代码语言:javascript
复制
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

忽略大小写敏感性,它会快得多。

代码语言:javascript
复制
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上,它的速度要快一点。

我建议你使用?:

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33222577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档