Как найти совпадения с регулярным выражением, а затем сопоставить с существующим списком - PullRequest
0 голосов
/ 22 апреля 2019

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

Так как мне сделать так, чтобы совпадение было только в том случае, если оно найдено в существующем списке?Вот мой код:


tickers = ['CA', 'V', 'MA', 'EB', 'PE', 'QCOM', 'BAC', 'A', 'AMZN']

text = 'This is sample text that mentions different companies and tickers like 
V (Visa), QCOM (Qualcomm), A (Agilent), GE (General Electric), MA (Mastercard), 
EB (Eventbrite), and PE (Parsley Energy Inc). The output should ignore values 
that do not match regex AND do not appear in the tickers list. For example, 
GXXX, ALLL, and QQWE should not match since they do not appear in the 
tickers list.'

regex = re.compile(r'\b[A-Z]{1,5}\b[.!?]?')

matches = regex.finditer(text)
for match in matches:
    print(match)

Ответы [ 2 ]

2 голосов
/ 22 апреля 2019

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

regex = "\\b(?:" + "|".join(tickers) + ")\\b"
matches = re.findall(regex, text)
print(matches)

['V', 'QCOM', 'A', 'MA', 'EB', 'PE']

В случае, если вам интересно, это шаблон регулярного выражения:used:

\b(?:CA|V|MA|EB|PE|QCOM|BAC|A|AMZN)\b

То есть он говорит, что соответствует любому из ваших символов тикера, с границами слов с обеих сторон, чтобы предотвратить ложное совпадение подстроки.

0 голосов
/ 22 апреля 2019

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

tickers = ['CA', 'V', 'MA', 'EB', 'PE', 'QCOM', 'BAC', 'A', 'AMZN']

text = '''This is sample text that mentions different companies and tickers like
 V (Visa), QCOM (Qualcomm), A (Agilent), GE (General Electric), MA (Mastercard),
 EB (Eventbrite), and PE (Parsley Energy Inc). The output should ignore values
 that do not match regex AND do not appear in the tickers list. For example,
 GXXX, ALLL, and QQWE should not match since they do not appear in the tickers
 list.'''

for tic1 in tickers:
    if tic1 in text.split():
        print(tic1, ' found')

Output:
V  found
MA  found
EB  found
PE  found
QCOM  found
A  found

если текст содержит посторонние символы новой строки, их необходимо удалить с помощью:
text = text.replace('\n', '')

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