我找到一个很好的问题,可以使用以下方法搜索字符串的多个结尾: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方式?
答案 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正则表达式不同,后者匹配最长的整体匹配。