如何检测字符串后缀并从列表中删除这些后缀元素? - 蟒蛇

问题描述 投票:0回答:3

如何检测字符串后缀并从列表中删除这些后缀元素? 我知道这看起来像 NLP、词干提取/词形还原任务,但该任务需要更简单的函数。

鉴于,如果列表中存在无后缀的项目,我需要删除具有

s
es
后缀的元素:

alist = ['bar','barbar','foo','foos','barbares','foofoos','bares']

我需要输出:

alist = ['bar','barbar','foo','foofoos']

我尝试了以下方法,但它不起作用,因为当我整理列表时,它得到

['bar', 'barbar', 'barbares', 'bares', 'foo', 'foofoos', 'foos']
而不是
['bar', 'bares', 'barbar', 'barbares',  'foo', 'foos', 'foofoos']

alist = ['bar','barbar','foo','foos','barbares','foofoos','bares']

prev = ""
no_s_list = []
for i in sorted(alist):
  if i[-2:] == "es" and i[:-2] == prev:
    continue
  elif i[-1:] == "s" and i[:-1] == prev:
    contine
  else:
    prev = i
    no_s_list.append(i)

以上输出:

>>> sorted(alist)
['bar', 'barbar', 'barbares', 'bares', 'foo', 'foofoos', 'foos']
python string list
3个回答
8
投票
def rm_suffix(s,suffixes):
    for suf in suffixes:
       if s.endswith(suf):
          return s[:-len(suf)]
    return s

alist = ['bar','barbar','foo','foos','barbares','foofoos','bares']
salist = set(alist)
suffixes = ('es','s')
blist = [x for x in alist 
         if (not x.endswith(suffixes)) or (rm_suffix(x,suffixes) not in salist)]
print blist  # ['bar', 'barbar', 'foo', 'foofoos']

1
投票

您也可以在这里使用

regex

re.split()
将返回类似以下内容:

barbar
-->
['barbar']

foos
-->
['foo', 's', '']

barbares
-->
['barbar', 'es', '']

foofoos
-->
['foofoo', 's', '']

因此,如果返回列表的长度大于 1 并且返回列表中的第一个元素在

alist
中找到,则可以将其删除。

code

In [106]: alist = ['bar','barbar','foo','foos','barbares','foofoos','bares']

In [107]: s=set(alist)

In [108]: for x in s.copy():
     sol=re.split(r'(es|s)$',x)
     if len(sol)>1 and sol[0] in s:
         s.remove(x)
   .....:         

In [109]: s
Out[109]: set(['bar', 'foofoos', 'barbar', 'foo'])

0
投票

要检测常见字符串后缀并删除它们,这是我的解决方案:

import os 

def remove_common_suffix(strings):
  " remove a common suffix among a list of strings "
  # Find the common suffix of the strings
  suffix = os.path.commonprefix([string[::-1] for string in strings])[::-1]
  if len(suffix) > 1: # Remove the common suffix from each string
    return [string[:-len(suffix)] for string in strings]
  else: # no common portions; return input
    return strings

然后检查属于所有输入字符串的后缀,如果存在,则将其删除。请注意,如果不存在公共后缀,则末尾的 if/else 子句是必需的,因为

string[:0]
将返回空字符串
''

© www.soinside.com 2019 - 2024. All rights reserved.