Соответствие строк в Python?

У меня проблемы с сопоставлением строк в Python. То, что я пытаюсь сделать, это искать строки в таких документах и ​​пытаться сопоставить каждую строку с конкретными фразами. Я читаю во всех строках и разбираю суп Beautfiul на раздетые строки, затем перебираю список всех строк в документе. Оттуда я использую следующий код для соответствия определенным строкам:

if row.upper() == ("AUDIT COMMITTEE REPORT" or "REPORT OF THE AUDIT COMMITTEE"):
    print("Found it!")
if "REPORT" in row.upper():
    print ("******"+row.upper()+"******")

Когда код запускается, я получаю следующий вывод:

******COMPENSATION COMMITTEE REPORT******
******REPORT OF THE AUDIT COMMITTEE******
******REPORTING COMPLIANE******
******COMPENSATION COMMITTEE REPORT******
******REPORT OF THE AUDIT COMMITTEE******

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

РЕДАКТИРОВАТЬ: Еще одно примечание, которое следует сделать, это то, что эти документы довольно большие, некоторые из них легко превышают 50 страниц, и проверки, находится ли строка только в строке, недостаточно. Это должно быть точное совпадение.

2 ответа

Решение

Вы можете сделать что-то подобное, используя понимание списка.

row = '******AUDIT COMMITTEE REPORT******'
match = ["AUDIT COMMITTEE REPORT", "REPORT OF THE AUDIT COMMITTEE"]
is_match = sum([m in row.upper() for m in match])

if is_match:
    print("Found it!")
if "REPORT" in row.upper():
    print ("******"+row.upper()+"******")

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

match = ["AUDIT COMMITTEE REPORT", "REPORT OF THE AUDIT COMMITTEE"]

Затем мы перебираем все возможные совпадения и видим, соответствует ли что-либо строке row, Если что-то совпадает, то в список будет добавлено истинное логическое значение, и мы можем использовать это, чтобы определить, было ли совпадение.

is_match = sum([m in row.upper() for m in match])

Если вы удалите sum() Вы можете видеть, что вывод понимания списка - это просто список логических значений.

print([m in row.upper() for m in match])
[True, False]

Если вы хотите быть немного более эффективным и простым, вы можете реализовать функцию с циклом for.

matches = ["AUDIT COMMITTEE REPORT", "REPORT OF THE AUDIT COMMITTEE"]
def is_match(row):
    for match in matches:
        if match in row.upper():
            return True
    return False

Этот цикл будет перебирать все возможные совпадения, если он найдет совпадение, он немедленно вернет True, в противном случае он выйдет и вернет False.

Как насчет этого,

if row.upper() in ("AUDIT COMMITTEE REPORT", "REPORT OF THE AUDIT COMMITTEE"):
    print("Found it!")
if "REPORT" in row.upper():
    print ("******"+row.upper()+"******")

Обратите внимание, что ("str1" or "str2") возвращает первую строку, т.е. 'str1',

>>> ("AUDIT COMMITTEE REPORT" or "REPORT OF THE AUDIT COMMITTEE")
'AUDIT COMMITTEE REPORT'
Другие вопросы по тегам