регулярное выражение Python до первой группы чисел - PullRequest
1 голос
/ 19 марта 2019

У меня есть следующий текст:

Coast Repair, * Норфолк, штат Вирджиния, получает контракт на сумму не более, чем 212 967 725 долларов США с фиксированной ценой, с неопределенной доставкой / с неопределенным количеством (IDIQ) и многократный контракт (MAC) на ремонт, техническое обслуживание и модернизацию судна. кораблей класса поверхностных бойцов (DDG и CG) и кораблей-амфибий (LSD, LPD и LHD), размещенных в Мейпорте, штат Флорида, по лоту 1. Эта награда была получена при скользящем допуске текущей IDIQ-MAC Lot 1. Этот контракт включает в себя опционы, в случае реализации которых совокупная стоимость этого контракта увеличится до 376 964 825 долл. США.

Я пытаюсь захватить текст слева от первой запятой, второй запятой, третьей запятой и суммы 212 967 725 долларов США.

Мое регулярное выражение до сих пор: (.*)(?:, )(?:.*)(?:\$([0-9,]+)

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

Итак, моя конечная цель - получить:

('Coast Repair,* Norfolk, Virginia', '212,967,725')

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Вместо того, чтобы пытаться захватить определенное количество запятых, давайте попробуем регулярное выражение, чтобы получить «все до последней запятой перед строкой 0-9». Это регулярное выражение будет

([^$]*),.*?\$([0-9,]+)

Так что в основном пошагово,

  • ([^$]*) Захватывать каждый не-$ символ. [^$] вместо . важно, чтобы вещь остановилась у первого знака доллара вместо последнего .
  • \$([0-9,]+) Захват числа запятыми, сразу после которых стоит знак доллара
  • ,.*? эффективно соответствует последней запятой перед знаком доллара, а затем лениво съедает все символы между запятой и первым знаком доллара.

Вот ссылка regex101, чтобы показать, что она работает

0 голосов
/ 20 марта 2019

Используйте двухэтапный подход:

  • Найти текст перед суммой (до первого $ char - группа № 1) и сама сумма (группа № 2).
  • Разделите группу # 1 запятыми.

Таким образом, шаблон для использования на первом шаге:

pat1 = re.compile(r'^([^$]+)(\$[\d,]+)')

Тогда используйте шаблон:

m = pat1.search(txt)

и сохраните обе группы захвата:

g1 = m.group(1)
g2 = m.group(2)

Затем найдите части текста перед каждой запятой (шаг 2):

g1.split(',')

получение:

['Coast Repair', '* Norfolk', ' Virginia', ' is awarded a not-to-exceed ']

(текст перед первой запятой (Coast Repair), вторая запятая (* Norfolk), третья запятая (Virginia) и, наконец, перед суммой (is awarded a not-to-exceed)).

Конечно, сумма указана в переменной g2, поэтому вы можете распечатать ее тоже.

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