Как я могу написать регулярное выражение, чтобы все регулярные выражения представляли собой набор, содержащий две возможные группы? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь найти в тексте экземпляры римских цифр, за которыми следуют остановка и пробел, например IV..Они указывают на начало стихов.Однако некоторые стихи не начинаются с римских цифр, поэтому я вставил теги [NV] в начале этих стихов.У меня есть регулярное выражение, которое может найти цифры и регулярное выражение, которое может найти теги [NV], но я не могу объединить их в одном регулярном выражении, которое будет искать один или другой из них.

Мое регулярное выражение длянахождение цифр:

numeralpat = re.compile(r'[IVX]{1,4}\. ')

Я подумал, что могу поместить это в набор с другим регулярным выражением, чтобы найти либо цифру, либо тег [NV]:

numeralpat = re.compile(r'[(\[NV\])([IVX]{1,4}\. )]')

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

Изменить, чтобы добавить образец текста:

Текст:

I. this is some text with a verse numeral
II. this is some text with a verse numeral
III. this is some text with a verse numeral
[NV]this is text with no verse numeral
IV. this is some text with a verse numeral
V. this is some text with a verse numeral

Ожидаемые совпадения:

'I. '
'II. '
'III. '
'[NV]'
'IV. '
'V. '

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вы можете указать альтернативный поиск следующим образом: r'(abc|def)' - который ищет либо 'abc', либо 'def' - вы также должны экранировать скобки, чтобы искать явные \[NV\], а не 'N' или 'V':

import re

regex = r"(\[NV\]|[IVX]{1,4}\.)"

test_str = ("I. Some text\n"
    "some Text\n"
    "II. some text\n"
    "[NV] more text\n")

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum= matchNum,
           start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum= groupNum,
               start = match.start(groupNum),
               end = match.end(groupNum), 
               group = match.group(groupNum)))

Вывод:

Match 1 was found at 0-2: I.
Group 1 found at 0-2: I.
Match 2 was found at 23-26: II.
Group 1 found at 23-26: II.
Match 3 was found at 37-41: [NV]
Group 1 found at 37-41: [NV]

См. https://regex101.com/r/MpMxcP/1

Он ищет либо '[NV]', либо любой из '[IVX]' до 4 раз, за ​​которым следует литерал'.'

0 голосов
/ 15 февраля 2019

Вы можете объединить оба ваших регулярных выражения, используя чередование следующим образом:

(?:\[NV\]|[IVX]{1,4}\. )

Это будет соответствовать [NV] ИЛИ любому из I V X символов от 1 до 4 раз, после чего следует. и пробел.

Демонстрация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...