2015-03-29 3 views
1

Некоторые человеческие языки отличаются морфологией досягаемости и развитой системой грамматических полов. Например, в славянских языках почти каждый прилагательное в одной грамматическом числе имеет три различных форм, в зависимости от количества родов (мужского, женственного и среднего рода):Regex: заменить подстроку на несколько форм слов

white <-> белый (m), белая (f), белое (n)  

В некоторых случаях это было полезно получить список возможных форм слов при использовании регулярных выражений для замены подстроки.

Сейчас мне очень интересно, если Python (или любой другой язык сценариев) позволяет делать такие вещи, как ниже (ПРЕДУПРЕЖДЕНИЕ: фрагменты кода ниже является Python-как псевдокод, но не рабочий код Python) :

# I would like to handle russian genders like that: 
>>> re.sub(r"Бел.", r"Бел[ый|ая|ое]", "Бел. Берель") 
["Белый Берель", "Белая Берель", "Белое Берель"] 

# A very artifical example for those who prefer latin: 
>>> re.sub(r"Go.", r"Go[ld|lden]", "Go. Ochre") 
["Gold Ochre", "Golden Ochre"] 

Могу ли я использовать регулярные выражения для получения списка совпадающих комбинаций слов?

+0

Был ли это рабочий код Python в вашем примере или только желаемый код? –

+0

Вы можете использовать цикл, чтобы пройти через каждый пол, не так ли? – Jerry

+0

Было бы намного проще получить представление о том, что вы хотите сопоставить, и о том, что вы хотите заменить, если вы используете '[a-zA-Z0-9]' вместо кириллицы. Даже если это не имеет никакого смысла - просто очень трудно «прочитать» это и увидеть различия. – xph

ответ

2

Нет, но вы можете перебрать список суффиксов со списком понимания, как это (для Python 2):

>>> suffixes = u'ый|ая|ое'.split('|') 
>>> suffixes 
[u'\u044b\u0439', u'\u0430\u044f', u'\u043e\u0435'] 
>>> replacements = [re.sub(u"Бел.", u"Бел%s" % s, u"Бел. Берель") for s in suffixes] 
>>> replacements 
[u'\u0411\u0435\u043b\u044b\u0439 \u0411\u0435\u0440\u0435\u043b\u044c', u'\u0411\u0435\u043b\u0430\u044f \u0411\u0435\u0440\u0435\u043b\u044c', u'\u0411\u0435\u043b\u043e\u0435 \u0411\u0435\u0440\u0435\u043b\u044c'] 
>>> for s in replacements: 
...  print s 
... 
Белый Берель 
Белая Берель 
Белое Берель 

Это несколько понятнее в Python 3:

>>> suffixes = u'ый|ая|ое'.split('|') 
>>> suffixes 
['ый', 'ая', 'ое'] 
>>> >>> suffixes = u'ый|ая|ое'.split('|') 
>>> suffixes 
[u'\u044b\u0439', u'\u0430\u044f', u'\u043e\u0435'] 
>>> replacements = [re.sub("Бел.", "Бел%s" % s, "Бел. Берель") for s in suffixes] 
>>> replacements 
['Белый Берель', 'Белая Берель', 'Белое Берель'] 
2

Спасибо за ваш латинский пример!

Я хотел бы использовать цикл для всех возможных условий:

import re 

str = "Go. Ochre" 

find_list = [r'Go.'] 
replace_list = ['Gold', 'Golden'] 

for value in find_list: 
    for item in replace_list: 
     print re.sub(value, item, str) 

Я не уверен, если тот действительно то, что вы хотите, - и я не знаю много об эффективности этого метода.

Но это очень читаемый код, простой в обслуживании - и его можно легко записать в качестве повторно используемой функции для общего использования.


... когда дело доходит до этого, например, было бы лучше всего replace() строки - нет необходимости в регулярном выражении.

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