Python - Regex: захват аббревиатур, основанных на количестве заглавных букв перед аббревиатурой - PullRequest
0 голосов
/ 04 июня 2019

У меня есть программа, которая ищет аббревиатуры в абзаце и определяет их на основе предшествующих слов из числа символов в аббревиатуре. Однако для аббревиатур, в которых есть такие слова, как «in» и «and», которые не являются частью аббревиатуры, у моего кода есть проблемы. По сути, я хочу, чтобы он считал предыдущий текст, только если слово начинается с заглавной буквы.

import re

s = "Too many people, but not All Awesome Dudes (AAD) only care about the  Initiative on Methods, Measurement, and Pain Assessment in Clinical  Trials (IMMPACT)."
allabbre = []

for match in re.finditer(r"\((.*?)\)", s):
 start_index = match.start()
 abbr = match.group(1)
 size = len(abbr)
 words = s[:start_index].split()[-size:]
 definition = " ".join(words)
 abbr_keywords = definition + " " + "(" + abbr + "}"
 pattern='[A-Z]'

 if re.search(pattern, abbr):
     if abbr_keywords not in allabbre:
        allabbre.append(abbr_keywords)
     print(abbr_keywords)

Токовый выход:
Все удивительные парни (AAD}
Измерение и оценка боли в клинических испытаниях (IMMPACT}

Желаемый результат:
Все удивительные парни (AAD}
Инициатива по методам, измерению и оценке боли в клинических испытаниях (IMMPACT)

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Мое мнение о проблеме:

txt = "Too many people, but not All Awesome Dudes (AAD) only care about the  Initiative on Methods, Measurement, and Pain Assessment in Clinical  Trials (IMMPACT)."

import re
from itertools import groupby

t = [list(g) if v else list(g)[::-1] for v, g in groupby(re.findall(r'\b[A-Z].+?\b', txt)[::-1], lambda k: k.upper() == k)]
for a, b in zip(t[::2], t[1::2]):
    abbr, meaning = a[0], b[len(b) - len(a[0]):len(b) - len(a[0]) + len(a[0])]
    if all(c1 == c2[0] for c1, c2 in zip(abbr, meaning)):
        print(' '.join(meaning),'(' + abbr + ')')

Отпечатки:

Initiative Methods Measurement Pain Assessment Clinical Trials (IMMPACT)
All Awesome Dudes (AAD)
1 голос
/ 04 июня 2019
import re

s = "Too many people, but not All Awesome Dudes (AAD) only care about the  Initiative on Methods, Measurement, and Pain Assessment in Clinical  Trials (IMMPACT)."
allabbre = []

for match in re.finditer(r"\((.*?)\)", s):
 start_index = match.start()
 abbr = match.group(1)
 size = len(abbr)
 words = s[:start_index].split()
 count=0
 for k,i in enumerate(words[::-1]):
  if i[0].isupper():count+=1
  if count==size:break
 words=words[-k-1:] 
 definition = " ".join(words)
 abbr_keywords = definition + " " + "(" + abbr + ")"
 pattern='[A-Z]'

 if re.search(pattern, abbr):
     if abbr_keywords not in allabbre:
        allabbre.append(abbr_keywords)
     print(abbr_keywords)

Выход:

Все удивительные парни (AAD)

Инициатива по методам, измерениям и оценке боли в клинических испытаниях (IMMPACT)

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