Невозможно получить индивидуальный результат с помощью регулярных выражений - PullRequest
4 голосов
/ 07 июля 2019

Я пытаюсь выяснить, как я могу изменить свой существующий шаблон регулярных выражений или создать новый, чтобы получить все строки, которые содержат dear. Если сопоставлено, сценарий должен печатать все эти строки от : до конца этих строк. Манипулирование строками здесь не вариант для получения результата.

Я пытался с:

import re

instr = """
Expression: It's been a while man.
Expression: How have you been moron?
Expression: Good to see you dear.
Greeting: How is everything dear?
Greeting: Hi dear, how are you?
"""
pattern = r'.*(?<=dear)'

for item in instr.splitlines():
    if re.search(pattern, item):
        print(item)

Результат, который я получаю:

Expression: Good to see you dear.
Greeting: How is everything dear?
Greeting: Hi dear, how are you?

Что я хочу получить:

Good to see you dear.
How is everything dear?
Hi dear, how are you?

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

Ответы [ 4 ]

2 голосов
/ 07 июля 2019

Другим вариантом может быть использование якоря ^ и группы захвата:

^[^:]*:\s*(.*\bdear\b.*)

Объяснение

  • ^ Начало строки
  • [^:]* Match 0+ times not: , then: `
  • \s* Соответствует 0+ раз символу пробела
  • ( Захватывающая группа
    • .*\bdear\b.* Соответствует дорогой между границами слов и любым символом слева и справа от него
  • ) Закрыть группу захвата

Regex demo | Python demo

Например:

import re

instr = """
Expression: It's been a while man.
Expression: How have you been moron?
Expression: Good to see you dear.
Greeting: How is everything dear?
Greeting: Hi dear, how are you?
"""
pattern = r'^[^:]*:\s*(.*\bdear\b.*)'

for item in instr.splitlines():
    res = re.search(pattern, item)
    if res:
        print(res.group(1))

Результат

Good to see you dear.
How is everything dear?
Hi dear, how are you?
2 голосов
/ 07 июля 2019

Вы можете использовать позитивный взгляд, чтобы захватывать только то, что идет после двоеточия. Примерно так должно работать:

(?<=:).*\bdear\b.*

Демо .

Я использовал утверждение границы слова \b, чтобы избежать сопоставления с такими понятиями, как «деаэратор». Не стесняйтесь удалять их, если это нежелательное поведение.

1 голос
/ 07 июля 2019

Это выражение,

(?=:.*\bdear\b):\s*(.*)

может работать здесь.

Выражение объяснено на верхней правой панели этой демонстрации , если вы хотите продолжить изучение или изменить его, а в этой ссылке вы можете посмотреть, какесли хотите, он пошагово будет сопоставляться с некоторыми примерами входных данных.

Тест с re.findall

import re

regex = r"(?=:.*\bdear\b):\s*(.*)"

test_str = ("Expression: It's been a while man.\n"
    "Expression: How have you been moron?\n"
    "Expression: Good to see you dear.\n"
    "Greeting:      How is everything dear?\n"
    "Greeting: Hi dear, how are you?\n"
    "Greeting:   Hi dear, how are you?\n"
    "dear: Hi there, how are you?")

print(re.findall(regex, test_str))

Тест с re.finditer

import re

regex = r"(?=:.*\bdear\b):\s*(.*)"

test_str = ("Expression: It's been a while man.\n"
    "Expression: How have you been moron?\n"
    "Expression: Good to see you dear.\n"
    "Greeting:      How is everything dear?\n"
    "Greeting: Hi dear, how are you?\n"
    "Greeting:   Hi dear, how are you?\n"
    "dear: Hi there, how are you?")

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)))
1 голос
/ 07 июля 2019
>>> for m in re.finditer(r'^[^:]+:\s*(.*dear.*)', instr, flags=re.M):
...     print(m[1])
... 
Good to see you dear.
How is everything dear?
Hi dear, how are you?
  • re.finditer для итерации по всем совпадениям
  • flags=re.M, так что якоря ^ и $ будут совпадать для каждой строки, а не один раз для всей строки
  • ^[^:]+:\s* для покрытия строки от начала строки до : и необязательных пробелов
  • (.*dear.*) соответствует остальной части строки, если она содержит dear (обратите внимание, что . не будетсоответствует символам новой строки по умолчанию)
  • Поскольку необходимая строка находится внутри группы захвата, m[1] выдаст только эту часть вместо всей строки
    • использует m.group(1), если версия Python меньше 3,6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...