正则表达式搜索多个后缀

时间:2018-09-27 14:55:44

标签: python regex

我要搜索的目标词很多

words = ['Word1', 'Word2', 'Word3']

有人告诉我这种正则表达式:

suffix = re.compile('(?:{words}) (\\w+)'.format(words='|'.join(words)))

非常有效,因为当遇到与表达式不匹配的字符时,它会立即使regex评估失败。

但是,相反的方法效率不高:

prefix = re.compile('(\\w+) (?:{words})'.format(words='|'.join(words)))

是否有一种优雅的方法来指示python的正则表达式进行反向搜索?

编辑

已要求我添加示例用法:

# prefix search
title = re.compile('(?:Mr.|Mrs.|Ms.|Dr. |Lt.) (\\w+)')
# suffix search
company = re.compile('(\\w+) (?:Inc.| LLP.|ltd.|GMBH)')
# invoking the regex
all_people_names  = title.findall(document)
all_company_names = company.findall(document)

编辑2

很多人都对时间差异的重要性表示怀疑。

我已经实现了2种方法:endswith()endswith_rev()会按照kabanus的建议反转字符串和结果。

这些是结果:

Timing

如您所见,即使后缀很少,它也有很大的不同。

2 个答案:

答案 0 :(得分:2)

好吧,您的方式必须测试所有可能的前缀(直到后缀)。只有在字符串足够长的情况下,解决此问题的一种方法是反转所有内容,因此回到第一个示例:

prefix = re.compile('(?:{words}) (\\w+)'.format(words='|'.join([word[::-1] for word in words])))
re.match(prefix,mystring[::-1])

所以您从头开始搜索,然后返回相同的模式-记住要逆转比赛。 我想知道单词和字符串的列表要花多长时间才能使其变得值得。显然,这是一个主要的优化助推器,请参见OP的某些时间。

答案 1 :(得分:1)

在某些情况下可以使用正则表达式,在其他情况下则可以(例如)在配置允许您匹配模式的系统并且输入类型为RegEx模式时,但是对于这种简单的用例,RegEx只会浪费CPU周期。

这种用例很简单,因为您知道要匹配子字符串的位置-它们始终位于输入的末尾,因此每个suffix要么匹配给定的inputString,要么不匹配:

inputString[ len(inputString) - len(suffix) : ] == suffix

但是,当然,您已经拥有Python方法endswith(suffix),因此您可以使用以下方法进行测试:

inputString.endswith( suffix )

suffix参数可以是tuple,因此您可以执行以下操作:

suffixes = ( "Inc.", "inc.", "Gmbh", "ltd.", "LTD", "LLP" )
inputString.endswith( suffixes )

或者对于不区分大小写的搜索:

suffixes = ( "inc.", "gmbh", "ltd.", "llp" )
inputString.lower().endswith( suffixes )

无论如何,如果性能真的很重要,那么Python可能不是最好的语言。