Skip to content

Instantly share code, notes, and snippets.

@sloanlance
Last active July 10, 2025 18:54
Show Gist options
  • Save sloanlance/0e82df83e7233f4f694c0f9883ae3e9c to your computer and use it in GitHub Desktop.
Save sloanlance/0e82df83e7233f4f694c0f9883ae3e9c to your computer and use it in GitHub Desktop.
Python: Validating Roman Numerals via regex
# Note: Regex developed using regex101.com, which generated this code, then was edited further.
# See: https://regex101.com/r/Vj3CHI/5
# The regex below is part of the solution for HackerRank challenge:
# https://www.hackerrank.com/challenges/validate-a-roman-number
# The regex is probably incomplete, but it's good enough to pass HackerRank tests.
import re
regex = r'^(M{,3}(?=([^M]))){,1}([C]{,1}M{,1}){,1}([C]{,1}D{,3}){,1}([X]{,1}C{,3}){,1}(X{,1}L{,1}){,1}(I{,1}X{,3}){,1}(I{1,3}[VX]{,1}|VI{,3}){,1}$'
test_str = ('CDXXI\n'
'M\n'
'MMMCMXCIX\n\n'
'# No match\n'
'MMMM\n\n'
'# No match\n'
'LL\n\n'
'I\n'
'II\n'
'III\n'
'IV\n'
'V\n'
'VI\n'
'VII\n'
'VIII\n'
'IX\n'
'X\n'
'XI\n'
'XII\n'
'XIII\n'
'XIV\n'
'XV\n'
'XVI\n'
'XVII\n'
'XVIII\n'
'XIX\n'
'XX\n'
'XXI\n'
'XXII\n'
'XXIII\n'
'XXIV\n'
'XXV\n'
'XXVI\n'
'XXVII\n'
'XXVIII\n'
'XXIX\n'
'XXX\n'
'XXXI\n'
'XXXII\n'
'XXXIII\n'
'XXXIV\n'
'XXXV\n'
'XXXVI\n'
'XXXVII\n'
'XXXVIII\n'
'XXXIX\n'
'XL\n'
'XLI\n'
'XLII\n'
'XLIII\n'
'XLIV\n'
'XLV\n'
'XLVI\n'
'XLVII\n'
'XLVIII\n'
'XLIX\n'
'LI\n'
'LII\n'
'LIII\n'
'LIV\n'
'LV\n'
'LVI\n'
'LVII\n'
'LVIII\n'
'LIX\n'
'LX\n'
'LXI\n'
'LXII\n'
'LXIII\n'
'LXIV\n'
'LXV\n'
'LXVI\n'
'LXVII\n'
'LXVIII\n'
'LXIX\n'
'LXX\n'
'LXXI\n'
'LXXII\n'
'LXXIII\n'
'LXXIV\n'
'LXXV\n'
'LXXVI\n'
'LXXVII\n'
'LXXVIII\n'
'LXXIX\n'
'LXXX\n'
'LXXXI\n'
'LXXXII\n'
'LXXXIII\n'
'LXXXIV\n'
'LXXXV\n'
'LXXXVI\n'
'LXXXVII\n'
'LXXXVIII\n'
'LXXXIX\n'
'XC\n')
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
print(f'Match {matchNum} was found at {match.start()}-{match.end()}: {match.group()}')
for groupNum in range(1, len(match.groups()) + 1):
print(f'Group {groupNum} found at {match.start(groupNum)}-{match.end(groupNum)}: {match.group(groupNum)}')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment