2016-01-05 3 views
1

Мне нужно сопоставить римские цифры в тексте. Например Star Wars VII The Force Awakens я использую это выражение (?:^|\s)(IX|IV|V?I{0,3})(?:\s|$), но он соответствует VII с пробелами, т.е. _VII_Regex соответствует нечетным пространствам

I судимым (?<=^|\s)(IX|IV|V?I{0,3})(?=\s|$) но получить Exeption error: look-behind requires fixed-width pattern

Я думаю, что проблема с не захватом групп. Если я использую match или search - он возвращает только число, но с sub - он заменяет обе группы, не захватывающие захват, и группу захвата (число с пробелами).

Цель состоит в том, чтобы сопоставить римские цифры в тексте с пространством или ничем (начало/конец строки) до/после, а не как часть слова.

+0

Вы хотите только соответствуют римским номерам IX, IV, I, II, III, VI, VII, VIII? – timgeb

+0

Да. Ничего больше 9 –

ответ

2

Перемещение чередованием (|) вне назад ':

(?:^|(?<=\s))(IX|IV|V?I{0,3})(?=\s|$) 

See it in action


В качестве альтернативы, вы можете просто заменить lookarounds с word boundaries:

\b(IX|IV|V?I{0,3})\b 
+0

В первом примере я буду использовать вторую группу? Второй пример не работает –

+0

Обратите внимание, что '\ b (IX | IV | V? I {0,3}) \ b' также будет соответствовать пустой строке. В настоящее время я пытаюсь выяснить, как это предотвратить. – timgeb

+0

@DigitalGod, обновил первое регулярное выражение, чтобы использовать группу без захвата, поэтому вам не нужно ничего менять. Для второго - не могли бы вы привести пример, где он не работает? – ndn

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