Python Regex, чтобы найти строку между двумя строками - PullRequest
2 голосов
/ 10 июля 2019

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

Моя самая большая проблема связана с попыткой сформировать шаблон Regex для этого.Я пробовал несколько вариантов, близких к приведенному примеру.Оно должно быть близко.

import re

toFind = ['[]', '[x]']
text = "| Completed?|\n|------|:---------:|\n|Link Created    |   []   |\n|Research Done   |   [X] "

# Regex to search between parameters and make result lowercase if there are any uppercase Chars
result = (re.search("(?<=Link Created)(.+?)(?=Research Done)", text).lower())

# Gets rid of whitespace in case they move the []/[x] around
result = result.replace(" ", "")

if any(x in result for x in toFind):
    print("Exists")
else:
    print("Doesn't Exist")

Счастливый путь: я беру строку (текст) и использую выражение Regex, чтобы получить подстроку между созданной ссылкой и выполненным исследованием.

Затем сделайте результат строчным и избавьтесь от пробелов на случай, если они переместят [] / [x] s.Затем он просматривает строку (результат) для «[]» или «[x]» и печатает.

Фактический вывод: в настоящий момент все, что я продолжаю получать, - это «Нет», поскольку синтаксис Regex отключен..

Ответы [ 3 ]

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

Если вы хотите, чтобы . соответствовал символам новой строки, у вас есть опция re.S.

Кроме того, было бы лучше проверить, соответствует ли регулярное выражение, прежде чем продолжить дальнейшие вызовы.Ваш звонок lower() дал мне ошибку, потому что регулярное выражение не соответствовало, поэтому вызов result.group(0).lower() только тогда, когда result оценивается как true, безопаснее.

import re

toFind = ['[]', '[x]']
text = "| Completed?|\n|------|:---------:|\n|Link Created    |   []   |\n|Research Done   |   [X] "

# Regex to search between parameters and make result lowercase if there are any uppercase Chars
result = (re.search("(?<=Link Created)(.+?)(?=Research Done)", text, re.S))

if result:
    # Gets rid of whitespace in case they move the []/[x] around
    result = result.group(0).lower().replace(" ", "")

    if any(x in result for x in toFind):
        print("Exists")
    else:
        print("Doesn't Exist")
else:
    print("re did not match")

PS: все reопции описаны в документации re модуля .Найдите re.DOTALL, чтобы узнать подробности о re.S (это синонимы).Если вы хотите объединить параметры, используйте побитовое ИЛИ.Например, re.S|re.I будет иметь . совпадение с новой строкой и совпадение без учета регистра.

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

Похоже, регулярное выражение является избыточным для этой конкретной работы, если я что-то упустил (также мне не понятно, зачем вам нужен шаг, который удаляет пробелы из подстроки). Вы можете просто разделить на «Ссылка создана», а затем разделить следующую строку на «Исследования завершены».

text = "| Completed?|\n|------|:---------:|\n|Link Created    |   []   |\n|Research Done   |   [X] "

s = text.split("Link Created")[1].split("Research Done")[0].lower()

if "[]" in s or "[x]" in s:
    print("Exists")
else:
    print("Doesn't Exist")

# Exists
1 голос
/ 10 июля 2019

Я полагаю, что символы новой строки \n вызывают проблемы. Вы можете обойти это, используя [\s\S]+ как таковое:

import re

toFind = ['[]', '[x]']
text = "| Completed?|\n|------|:---------:|\n|Link Created    |   []   |\n|Research Done   |   [X] "

# New regex to match text between
# Remove all newlines, tabs, whitespace and column separators
result = re.search(r"Link Created([\s\S]+)Research Done", text).group(1)
result = re.sub(r"[\n\t\s\|]*", "", result)

if any(x in result for x in toFind):
    print("Exists")
else:
    print("Doesn't Exist")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...