您可以使用os.path.commonprefix
来计算公共前缀。它用于计算文件路径列表中的共享目录,但可用于通用上下文中。
然后反转字符串,并再次申请共同的前缀,然后反转,来计算共同后缀(改编自https://gist.github.com/willwest/ca5d050fdf15232a9e67)
dataset = """id.4030.paid
id.1280.paid
id.88.paid""".splitlines()
import os
# Return the longest common suffix in a list of strings
def longest_common_suffix(list_of_strings):
reversed_strings = [s[::-1] for s in list_of_strings]
return os.path.commonprefix(reversed_strings)[::-1]
common_prefix = os.path.commonprefix(dataset)
common_suffix = longest_common_suffix(dataset)
print("{}*{}".format(common_prefix,common_suffix))
结果:
id.*.paid
编辑:如WIM注意到:
- 当所有字符串相等时,常用前缀&后缀为应该返回字符串本身而不是
prefix*suffix
:应检查所有字符串是否相同
- 当通用前缀&后缀重叠/有共享字母时,这也会混淆计算:应该计算字符串上的公共后缀减去公共前缀
因此,需要一种全方位的方法来预先测试列表以确保至少有2个字符串不同(在过程中凝结前缀/后缀公式),并计算公共后缀切片以删除常见前缀:
def compute_generic_string(dataset):
# edge case where all strings are the same
if len(set(dataset))==1:
return dataset[0]
commonprefix = os.path.commonprefix(dataset)
return "{}*{}".format(commonprefix,os.path.commonprefix([s[len(commonprefix):][::-1] for s in dataset])[::-1])
现在让我们来测试:
for dataset in [['id.4030.paid','id.1280.paid','id.88.paid'],['aBBc', 'aBc'],[]]:
print(compute_generic_string(dataset))
结果:
id.*.paid
aB*c
*
(当数据集为空,代码返回*
,也许这应该是另一种边缘情况)
Dang,'os.path.commonprefix'!多久了。 – wim
upvote for commonprefix ...不知道它是否存在。 – Solaxun
相当不错的一个,加上一个 –