получение строки с использованием регулярных выражений - PullRequest
1 голос
/ 20 сентября 2019
import re
s = 'words here plus num A18-11186 B7  and Q12-45786 D3'

У меня есть следующая строка, и я хочу извлечь A18-11186 B7 и Q12-45786 D3 с помощью регулярных выражений.Я попробовал следующее

reg = r'\b(?=\d*[A-Z])((?:[A-Z0-9]+-)(?:\d+-)?\d+)\b'
r1 = re.findall(reg,s)

, которое дает мне

['A18-11186', 'Q12-45786']

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

Как изменить reg, чтобы получить желаемый результат?

желаемый результат

['A18-11186 B7', 'Q12-45786 D3']

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Вы можете получить свои совпадения без использования положительного взгляда и использовать границы слов \b перед сопоставлением первого символа в верхнем регистре и последней цифры.

\b[A-Z][0-9]+-[0-9]+ [A-Z][0-9]+\b

По частям

  • \b Граница слова
  • [A-Z][0-9]+ Совпадение одиночных цифр AZ и 1+
  • -[0-9]+ Совпадение -, 1+ цифр и пробел
  • [A-Z][0-9]+ Совпадение одиночных цифр AZ и 1+
  • \b Граница слова

Regex demo | Python demo

Например

import re
regex = r"\b[A-Z][0-9]+-[0-9]+ [A-Z][0-9]+\b"
test_str = "words here plus num A18-11186 B7  and Q12-45786 D3"
print(re.findall(regex, test_str))

Выход

['A18-11186 B7', 'Q12-45786 D3']
1 голос
/ 20 сентября 2019

Если вы не уверены в ожидаемом форматировании, вы можете использовать:

[A-Z0-9-]+[A-Z0-9 -]*?[A-Z0-9-]+

https://regex101.com/r/LMvz15/1

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