Как найти сокращения, содержащие числа в строке - PullRequest
0 голосов
/ 27 июня 2019

Мне нужно сделать функцию, которая находит прописные сокращения, включая некоторые содержащие цифры, но я могу обнаружить только те, которые содержат только буквы.

Пример:

s= "the EU needs to contribute part of their GDP to improve the IC3 plan"

Я пытался

def acronym(s):
    return re.findall(r"\b[A-Z]{2,}\b", s)
print(acronym(s))

но я получаю только

[EU,GDP]

Что я могу добавить или изменить, чтобы получить

[EU,GDP,IC3]

спасибо

Ответы [ 3 ]

2 голосов
/ 27 июня 2019

Попробуйте:

import re

def acronym(s):
    return re.findall(r"\b(?:[0-9]+[A-Z][A-Z0-9]*)|(?:[A-Z][A-Z0-9]+)\b", s)

print(acronym('3I 33 I3 A GDP W3C'))

выход:

['3I', 'I3', 'GDP', 'W3C']

Это регулярное выражение означает:

Найдите любое слово (между \b, которое является "границей слова"), которое либо

  • начинается с цифры (или более) и затем должно содержать хотя бы одну заглавную букву, а затем может иметь другие буквы и цифры
  • начинается с заглавной буквы, а затем содержит как минимум другую заглавную букву или цифру.

?: позволяет нам не захватывать 2 группы (()|()), а только одну.

0 голосов
/ 27 июня 2019

Попробуй это.

Он похож на ответы Андрея и С. Пеллегрино, однако он не будет захватывать только строки с цифрами, например '123', и будет захватывать строки с цифрой в любой позиции, а не только в конце.

Объяснение шаблона:

\b - Соответствует границе слова (начало строки)

(?=.*[A-Z]) - Утверждать, что следующеевсе, что следует за заглавной буквой (т.е. строка содержит хотя бы одну заглавную букву).Это называется положительным взглядом вперед.

[A-Z\d]{2,} - совпадение заглавной буквы или цифры два или более раз.

\b - сопоставление границы другого слова (конец строки).

import re

def acronym(s):
    pattern = r'\b(?=.*[A-Z])[A-Z\d]{2,}\b'
    return re.findall(pattern, s)

Редактировать: добавить описание шаблона регулярного выражения.

0 голосов
/ 27 июня 2019

Это регулярное выражение не будет соответствовать числам (например, 123):

import re

s = "the EU needs to contribute part of their GDP to improve the IC3 plan"

def acronym(s):
    return re.findall(r"\b([A-Z]{2,}\d*)\b", s)

print(acronym(s))

Печать:

['EU', 'GDP', 'IC3']

Regex101 ссылка здесь .

...