Python / Regex: Как разрезать строку по шаблону регулярного выражения, сохраняя при этом шаблон в совпадениях? - PullRequest
1 голос
/ 21 февраля 2020

У меня есть строка, которая содержит предложения в форме:

"Мисс Смит, чтобы поговорить со своим коллегой мисс Смит, чтобы создать новые события для команды. Помощник руководителя группы, чтобы организовать утреннее выступление сеанс. для езды по городу. "

  • Предложения могут содержать или не содержать пунктуацию или правильный регистр.
  • Также может быть шум в тексте ( дополнительные символы, слова).
  • Я хочу разделить на следующие структуры:
    • "Мисс / Ms / Mr / Mrs до"
    • "Мисс / Ms / Mr / От миссис до "
    • " от руководителя группы до "
    • " от руководителя группы до "
    • ". До "

Я хотел бы нарезать это в списке:

["Ms Smith to talk to her colleague",
"Ms Smith to create new events for the team.",
"team Leader's assistant to organise morning stand-up session.",
"to drive around the city."]

Мое текущее решение работает, но очень не pythoni c, я уверен, что есть способы, чтобы избежать некоторое время l oop:

def slice(text):
    parts = []
    rule = "(^.+?)(?:(?:miss [a-z]+|ms [a-z]+|mrs [a-z]+|mr [a-z]+|team leader)(?:'s [a-z ]+?)?|\.) to.+?$"
    while True:
        try:
            part = re.findall(rule, text)[0]
            parts.append(part)
            # Remove part from text for next iteration
            text = text[len(part):]
        except IndexError:
            # findall returned empty list
            break
    # Add the remainder
    parts.append(text)
    return parts

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

1 Ответ

0 голосов
/ 21 февраля 2020

Вы можете делать все, что хотите, только с findall и захватом подгрупп. Этот вывод вы имели в виду?

import re

s = "Ms Smith to talk to her colleague Ms Smith to create new events for the team. " +\
    "team Leader's assistant to organise morning stand-up session. to drive around the city."

roles = "Miss|Ms|Mr|Mrs|team leader"
matches = re.findall(f"""
    (
        \ ?
        (
            (?:{roles})?      # Read the role
            (?:[\w\'\-\ ]*?)  # and name to group(1) aka "identity"
        )
        to
        ([\w\'\-\ ]+?)  # Read the other words to group(2) aka "task"
        (?={roles}|\.)  # until next role or dot
        [\.\ ]?
    )
    """,
    s,
    flags=re.IGNORECASE | re.VERBOSE,
)

print("Full matches:")
for m in matches:
    print(" *", m[0].strip())


print("\nSplit by identity and task:")
for full, identity, task in matches:
    print(f" * Identity: '{identity}', task: '{task.strip()}, full match: '{full.strip()}'")

Вывод:

Полные совпадения:
* Мисс Смит поговорит со своим коллегой
* Мисс Смит создавать новые события для команды.
* Помощник руководителя команды для организации утренней сессии.
* для езды по городу.

Разделение по личностям и задачам:
* Личность: «Мисс Смит», задача: «поговорить со своим коллегой, полный матч:« Мисс Смит поговорить со своим коллегой »
* Идентичность:« Мисс Смит », задача:« создать новые события для команды, полный матч: » Г-жа Смит создаст новые события для команды. '
* Идентичность: «помощник руководителя группы», задача: «организовать утреннюю сессию, полный матч:« помощник руководителя команды, чтобы организовать утреннюю сессию ».
* Идентификация: '', задача: 'объехать город, полный матч:' проехать по городу. '

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