我必须执行的任务如下:
说我有一个单词列表(只是一个例子......列表可以有任何单词):
'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)
如何执行“修剪”操作以相应地删除后缀并同时将单词添加到新列表? 请帮助。
答案 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]