使用.endswith(元组)进行测试时获得实际结尾

时间:2015-09-02 09:50:43

标签: python

我找到一个很好的问题,可以使用以下方法搜索字符串的多个结尾:endswith(tuple)

Check if string ends with one of the strings from a list

我的问题是,如何才能返回实际发现的元组中哪个值匹配?如果我有多个匹配怎么办?如何选择最佳匹配?

例如:

str= "ERTYHGFYUUHGFREDFYAAAAAAAAAA"
endings = ('AAAAA', 'AAAAAA', 'AAAAAAA', 'AAAAAAAA', 'AAAAAAAAA')
str.endswith(endings) ## this will return true for all of values inside the tuple, but how can I get which one matches the best

在这种情况下,可以从元组中找到多个匹配项,我该如何处理这个并返回最佳(最大)匹配,在这种情况下应该是:'AAAAAAAAA'我要删除它结束(可以用正则表达式完成)。

我的意思是可以在for循环中执行此操作,但也许有更简单的pythonic方式?

4 个答案:

答案 0 :(得分:1)

toString

答案 1 :(得分:1)

怎么样:

len(str) - len(str.rstrip('A'))

答案 2 :(得分:1)

>>> s = "ERTYHGFYUUHGFREDFYAAAAAAAAAA"
>>> endings = ['AAAAA', 'AAAAAA', 'AAAAAAA', 'AAAAAAAA', 'AAAAAAAAA']
>>> max([i for i in endings if s.endswith(i)],key=len)
'AAAAAAAAA'

答案 3 :(得分:-1)

str.endswith(tuple)(目前)实现为tuple上的简单循环,重复运行匹配,不考虑结尾之间的任何相似之处。

在示例中,正则表达式应该编译成一个基本上以线性时间运行的自动机:

regexp = '(' + '|'.join(
   re.escape(ending) for ending in sorted(endings, key=len, reverse=True
) + ')$'

编辑1 :正如Martijn Pieters正确指出的那样,Python的重新定位不会返回最长的整体匹配,但是对于替换项只匹配第一个匹配的子表达式:

https://docs.python.org/2/library/re.html#module-re

  

当一个模式完全匹配时,接受该分支。这意味着一旦A匹配,B将不会被进一步测试,即使它会产生更长的整体匹配

(强调我的)

因此,遗憾的是需要按长度排序。

请注意,这使得Python的re与POSIX正则表达式不同,后者匹配最长的整体匹配。