2013-02-23 2 views
0

для типичного набора суффиксов слов (ize, fy, ly, able ... и т. Д.), Я хочу знать, заканчивается ли какое-либо задание с любым из них, а затем удалять их. Я знаю, что это можно сделать итеративно с помощью word.endswith ('ize'), но я считаю, что есть способ опережающего регулярного выражения. Пробовал позитивный взгляд с конечным маркером $, но по какой-то причине не работал:Суффикс pgeon regex, соответствующий

pat='(?=ate|ize|ify|able)$' 
word='terrorize' 
re.findall(pat,word) 

ответ

2

Что вы ищете на самом деле (:)
Проверьте это:

re.sub(r"(?:ate|ize|ify|able)$", "", "terrorize") 

Посмотрите на этом сайте Regex.
Есть тоны полезных навыков регулярных выражений. Надеюсь, тебе понравится.

BTW, сама библиотека python является аккуратным & замечательным учебником.
я помощь() много :)

1

опережения является картина якорь, так же, как и ^$ якорь соответствует в определенном месте, но сами не совпадают.

Вы хотите, чтобы соответствовать этим суффиксы, но в конце слова, поэтому использовать слово край якорь \b вместо:

r'(ate|ize|ify|able)\b' 

затем использовать re.sub() заменить те:

re.sub(r'(ate|ize|ify|able)\b', '', word) 

, который прекрасно работает:

>>> word='terrorize' 
>>> re.sub(r'(ate|ize|ify|able)\b', '', word) 
'terror' 
1

Вам нужно настроить Parenthèse, просто изменить pat от:

(?=ate|ize|ify|able)$ 

к:

(?=(ate|ize|ify|able)$) 

Если вам нужно удалить суффиксы позже, вы можете использовать шаблон:

^(.*)(?=(ate|ize|ify|able)$) 

Test в REPL:

>>> pat = '^(.*)(?=(ate|ize|ify|able)$)' 
>>> word = 'terrorize' 
>>> re.findall(pat, word) 
[('terror', 'ize')] 
0

Если это словосочетание, то просто удалите проверку вперед, достаточно $.

3

Малоизвестный факт: endswith принимает кортеж возможностей:

if word.endswith(('ate','ize','ify','able')): 
    #... 

К сожалению, он не указывает, какая строка была найдена, так что Безразлично» t помочь с удалением суффикса.

+0

+1 для новой информации – hmghaly

Смежные вопросы