Как сопоставить и заменить несколько строк с регулярным выражением в Python - PullRequest
2 голосов
/ 20 октября 2019

Я пытаюсь заменить некоторый текст в Python на регулярное выражение.

Мой текст выглядит так:

WORKGROUP 1. John Doe ID123, Jane Smith ID456, Ohe Keedoke ID7890
Situation paragraph 1

WORKGROUP 2. John Smith ID321, Jane Doe ID654
Situation paragraph 2

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

WORKGROUP 1. [[John Doe]], [[Jane Smith]], [[Ohe Keedoke]]
Situation paragraph 1

WORKGROUP 2. [[John Smith]], [[Jane Doe]]
Situation paragraph 2

Пока у меня есть это.

re.sub(r"(WORKGROUP\s\d\.\s)",r"\1[[")
re.sub(r"(WORKGROUP\s\d\..+?)(?:\s\b\w+\b),(?:\s)(.+\n)",r"\1]], [[\2")
re.sub(r"(WORKGROUP\s\d\..+?)(?:\s\b\w+\b)(\n)",r"\1]]\2")

Это работает для групп с двумя людьми (WORKGROUP 2), нооставляет все идентификаторы, кроме первого и последнего лиц, если их больше двух. Таким образом, WORKGROUP 1 выглядит так:

WORKGROUP 1. [[John Doe]], [[Jane Smith ID456, Ohe Keedoke]]
Situation paragraph 1

К сожалению, я не могу сделать что-то вроде

re.sub(r"((\s\b\w+\b),(\s))+",r"\1]], [[\2")

, потому что оно будет соответствовать внутри параграфов ситуации.

Мой вопрос: возможно ли сделать несколько совпадений / замен в сегменте строки, не делая это универсально?

Ответы [ 3 ]

0 голосов
/ 20 октября 2019

Код

import re

test = """
WORKGROUP 1. John Doe ID123, Jane Smith ID456, Ohe Keedoke ID7890
Situation paragraph 1

WORKGROUP 2. John Smith ID321, Jane Doe ID654
Situation paragraph 2
"""

test = re.sub(' ID[0-9]+, ', ']], [[', test)
test = re.sub('\. ', '. [[', test)
test = re.sub(' ID[0-9]+', ']]', test)
print(test)

Выход

WORKGROUP 1. [[John Doe]], [[Jane Smith]], [[Ohe Keedoke]]
Situation paragraph 1

WORKGROUP 2. [[John Smith]], [[Jane Doe]]
Situation paragraph 2
0 голосов
/ 20 октября 2019

Вы можете вложить подстановки и заставить первую подстановку найти строки, начинающиеся сначала с WORKGROUP, а затем позволить второй подстановке найти и заменить общие разделенные токены внутри:

re.sub(
    r'^(WORKGROUP\s+\d+\.\s*)(.*)',
    lambda m: m.group(1) + re.sub(r'([^,\s][^,]*)\s+\S+(?=,|$)', r'[[\1]]', m.group(2)),
    text,
    flags=re.MULTILINE
)

так, чтобыучитывая:

text = '''WORKGROUP 1. John Doe ID123, Jane Smith ID456, Ohe Keedoke ID7890
Situation paragraph 1

WORKGROUP 2. John Smith ID321, Jane Doe ID654
Situation paragraph 2'''

выражение возвращает:

WORKGROUP 1. [[John Doe]], [[Jane Smith]], [[Ohe Keedoke]]
Situation paragraph 1

WORKGROUP 2. [[John Smith]], [[Jane Doe]]
Situation paragraph 2

Демо: https://repl.it/@blhsing/BoldElderlyQuerylanguage

0 голосов
/ 20 октября 2019

Если у вас установлен модуль regex:

(?<=\bWORKGROUP\s+\d+\.\s|,)\s*(.+?)\s*ID\d+\s*(?=,|$)

может работать нормально.

Если нет, вы можете просто сделать это в своем терминале, запустив:

$ pip install regex

или

$ pip3 install regex

Здесь мы предполагаем, что в вашем тексте могут присутствовать другие ID\d+, в противном случае, если вы этого не сделаете, ваша проблема будет намного проще.

Тест

import regex as re

regex = r"(?<=\bWORKGROUP\s+\d+\.\s|,)\s*(.+?)\s*ID\d+\s*(?=,|$)"

test_str = '''

WORKGROUP 1. John Doe ID123, Jane Smith ID456, Ohe Keedoke ID7890
Situation paragraph 1
WORKGROUP 2. John Smith ID321, Jane Doe ID654
Situation paragraph 2

WORKGROUP 11. Bob Doe ID123, Alice Doe ID123, John Doe ID123, Jane Smith ID456, Ohe Keedoke ID7890
Situation paragraph 1

WORKGROUP 21. John Smith ID321, Jane Doe ID654
Situation paragraph 2

'''


subst = "[[\\1]]"

print(re.sub(regex, subst, test_str, 0, re.MULTILINE))

Вывод

WORKGROUP 1. [[John Doe]],[[Jane Smith]],[[Ohe Keedoke]]
Situation paragraph 1
WORKGROUP 2. [[John Smith]],[[Jane Doe]]
Situation paragraph 2

WORKGROUP 11. [[Bob Doe]],[[Alice Doe]],[[John Doe]],[[Jane Smith]],[[Ohe Keedoke]]
Situation paragraph 1

WORKGROUP 21. [[John Smith]],[[Jane Doe]]
Situation paragraph 2

Если вы хотите упростить / изменить / изучить выражение, это было объяснено в верхней правой панели regex101.com . Если хотите, вы можете также посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.


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