条件删除python列表中的单词后缀

时间:2013-12-18 21:30:16

标签: python regex

我必须执行的任务如下:

说我有一个单词列表(只是一个例子......列表可以有任何单词):

'yappingly', 'yarding', 'yarly', 'yawnfully', 'yawnily', 'yawning','yawningly', 
'yawweed', 'yealing', 'yeanling', 'yearling', 'yearly', 'yearnfully','yearning', 
'yearnling', 'yeastily', 'yeasting', 'yed',  

我必须创建一个新的单词列表,在删除后缀后添加带有后缀ing的单词(即将酵母添加到新列表中作为酵母),其余单词将按原样添加

现在就插入以ing结尾的字符串而言,我编写了以下代码并且工作正常

 Data=[w[0:-3] for w in wordlist if re.search('ing$',w)]

但是如何将剩余的单词添加到列表中?如何在上面的if语句中添加else子句?我无法找到适合上述内容的文档。关于if的简写if语句,我确实遇到了几个关于SO的问题,但只是在上面的代码末尾添加else语句不起作用。我该怎么做?

其次,如果我必须为多个后缀扩展上述正则表达式,请按以下说明:

re.search('(ing|ed|al)$',w)

如何执行“修剪”操作以相应地删除后缀并同时将单词添加到新列表? 请帮助。

2 个答案:

答案 0 :(得分:3)

关于您的第一个问题,您可以使用位于for之前的ternary

Data=[w[0:-3] if re.search('ing$',w) else w for w in wordlist]

关于你的第二个问题,我认为最好的答案是使用re.sub作为@abarnert演示。但是,您也可以稍微调整一下re.search

的使用情况
Data=[re.search('(.*)(?:ing|ed|al)$', w).group(1) for w in wordlist]

最后,这里有一个关于comprehensions的更多信息的链接。

答案 1 :(得分:2)

首先,是什么让你认为你需要一个正则表达式?有更简单的方法来删除后缀。

其次,如果你想使用正则表达式,为什么不只是re.sub而不是尝试使用正则表达式和切片?例如:

Data = [re.sub('(ing|ed|al)$', '', w) for w in wordlist]

然后你不需要弄清楚切掉多少(这需要你跟踪re.search的结果,这样你才能获得组的长度,而不是仅仅把它变成一个博尔)。

但是如果你真的想按自己的方式做事,只需用条件表达式替换你的if过滤器,就像在iCodez的回答中一样。

最后,如果你坚持如何将某些东西放入单线中,只需将其从单线中取出即可。编写一个返回后缀剥离字符串的strip_suffixes函数应该很容易(如果没有后缀,则为原始字符串)。然后你可以写:

Data = [strip_suffixes(w) for w in wordlist]