2016-01-05 4 views
2

Нужна помощь с регулярными выражениями. Я хочу сопоставить некоторые римские цифры и заменить их на арабский.Python regex. Соответствие и замена римских цифр

Прежде всего, если использовать (IX|IV|V?I{0,3}) для соответствия римским цифрам (от 1 до 9). Тогда я добавить некоторую логику в любом пространстве (с текстом до) или ничего (начала/конца строки) с (?:^|\s)(?:\s|$)

Так Finaly я уже (?:^|\s)(IX|IV|V?I{0,3})(?:\s|$)

Он соответствует всем этим вариантам:

  1. некоторого текст VI
  2. IX здесь мы
  3. другого текст III

Если я определяю dict с римско-арабской картой {'iii': 3, 'IX': 9} - как отменить сопоставления со значениями из dict? Кроме того, он соответствует только первый accur, то есть в some V then III я получаю только V

ответ

1

Также он соответствует только первый accur, то есть в некотором V, то III я получаю только V

Я предполагаю, что вы используете re.match или re.search, что дает вам только один результат. Мы будем использовать re.sub, чтобы решить ваш основной вопрос, чтобы это не было проблемой. re.sub может принимать вызов. Мы заменяем любое соответствие соответствующим значением из вашего словаря. Использовать

re.sub(your_regex, lambda m: your_dict[m.group(1)], your_string) 

Предполагается, что любое возможное совпадение находится в вашем dict. Если нет, используйте

re.sub(your_regex, lambda m: your_dict[m.group(1)] if m.group(1) in your_dict else m.group(1), your_string) 
+0

Это работает, но у меня ошибка в регулярном выражении. С римскими числами пробелы также удаляются. 'star wars IV' преобразуется в' star wars4' или 'some III text' в' some3text' –

+0

@DigitalGod добавляет дополнительные пробелы в вашу подходящую группу 1, например: https://regex101.com/r/zA7lX5/1 – timgeb

+0

Я мало знаю о регулярных выражениях, но спасибо за помощь :) –

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