Python Regex: группа без захвата захвачена - PullRequest
0 голосов
/ 25 января 2020

Я придумал эти два шаблона регулярных выражений

1.

\([0-9]\)\s+([^.!?]+[.!?])

2.

[.!?]\s+([A-Z].*?[.!?])

Для сопоставления предложений в таких строках:

(1) Первое предложение, которое всегда следует за числом в параграфах. Это мое второе предложение. Это мое третье предложение, (...).

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

Однако третье предложение не захвачено, поскольку . использовался ранее. Моя цель - получить начальную точку этих предложений двумя способами:

  1. Получение вступительного предложения путем захвата начала после (1)
  2. Получение любого другого предложения путем распознавания точка, пробел и заглавная буква после нее.

Как можно избежать совпадения для 3-го и последующих предложений?

Спасибо за любую помощь!

Ответы [ 3 ]

1 голос
/ 25 января 2020

Вы можете использовать существующее регулярное выражение, просто поместив группу вокруг части предложения (.*?[.!?]) и получив группу 1 из вывода re.match:

import re

para = '(1) This is my first sentence, it has to be captured. This is my second sentence.'
print(re.search(r'\([0-9]\)\s+(.*?[.!?])', para).group(1))

Выход:

This is my first sentence, it has to be captured.
1 голос
/ 25 января 2020

У вас есть несколько вариантов сделать это. Первый - lookbehind . Вам следует заменить ':' на '<='. К сожалению, он не поддерживает шаблоны переменной длины. Так что допускается только один пробел

ss='(1) This is my first sentence, it has to be captured. This is my second sentence.'

re.search(r'(?<=\([0-9]\)\s).*?[.!?]', ss).group(0)

Вывод:

'This is my first sentence, it has to be captured.'

Вы также можете искать группу:

re.search(r'\([0-9]\)\s+(.*?[.!?])', ss).group(1)

Вывод:

'This is my first sentence, it has to be captured.'

Позволяет использовать шаблоны переменной длины

Оба варианта с минимальными изменениями исходного шаблона.

1 голос
/ 25 января 2020

Вы можете использовать группу захвата с отрицательным классом символов [^ Если вы хотите сопоставить 1 или более цифр, вы можете использовать [0-9]+

\([0-9]\)\s+([^.!?]+[.!?])
  • \([0-9]\) Соответствует ди git в скобках
  • \s+ Соответствует 1+ пробелам
  • ( Захват группа 1
    • [^.!?]+[.!?] Совпадение 1+ раз с любым символом, кроме ., !, ?. Затем сопоставьте одну из них.
  • ) Закрыть группу

Regex demo | Python demo

Например

import re

regex = r"\([0-9]\)\s+([^.!?]+[.!?])"
test_str = "(1) This is my first sentence, it has to be captured. This is my second sentence."

print(re.findall(regex, test_str))

Вывод

['This is my first sentence, it has to be captured.']

Если вы хотите сопоставить и другие предложения и иметь возможность различать первое предложение и другие, вы можете использовать чередование с другой группой захвата

(?:\([0-9]\)\s+([^.!?]+[.!?])|([A-Z].*?\.)(?: |$))

Regex demo

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