Regex включают только одну ди git между символами - PullRequest
0 голосов
/ 31 марта 2020

Мне нужно проанализировать документ PDF, и я использую PyPDF2 с re (regex).

Файл содержит несколько строк, как показано ниже:

18-02-202010:44:48PEDMILANO OVEST- BINASCOA1,40

Мне нужно извлечь из этой строки текст (полужирный) между временем и суммой:

PEDMILANO OVEST- BINASCOA

Следующий код работает, но иногда этот код не находит ничего, так как, например, между этими символами может быть число , 18-02-202010:44:48PEDMILANO OVE3ST- BINASCOA1,40.

regex = re.compile(r'\d\d-\d\d-\d\d\d\d\d\d:\d\d:\d\d\D+\d+,\d\d')

Есть ли способ включить число в это регулярное выражение?

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Я предлагаю использовать

import re
text = "18-02-202010:44:48PEDMILANO OVEST- BINASCOA1,40"
print( re.sub(r'^\d{2}-\d{2}-\d{5,6}:\d{2}:\d{2}(.*?)\d+(?:,\d+)?$', r'\1', text) )

Его также можно записать как

re.sub(r'^\d{2}-\d{2}-\d{5,6}:\d{2}:\d{2}|\d+(?:,\d+)?$', '', text)

Или, если вы предпочитаете сопоставление и захват:

m = re.search(r'^\d{2}-\d{2}-\d{5,6}:\d{2}:\d{2}(.*?)\d+(?:,\d+)?$', text)
if m:
    print( m.group(1) )

См. онлайн Python демо . С этим решением ваши данные могут начинаться с любого символа и будут содержать любой символ (за исключением символов разрыва строки, так как ваши данные в одной строке).

Regex details

  • ^ - начало строки
  • \d{2}-\d{2}-\d{5,6}:\d{2}:\d{2} - строка даты и времени: две цифры, -, две цифры, -, пять или шесть цифр, :, две цифры , : две цифры
  • (.*?) - группа 1: любой ноль или более символов, кроме символов разрыва строки, как можно меньше
  • \d+(?:,\d+)? - шаблон значений типа int / float : 1+ цифр, за которыми следует необязательная последовательность , и 1+ цифр
  • $ - конец строки.

См. Демонстрационный пример regex .

1 голос
/ 31 марта 2020

Следующее должно упростить текущее регулярное выражение:

import re

s = '18-02-202010:44:48PEDMILANO OVE3ST- BINASCOA1,40'

re.search(r'\:\d+([A-Z].*?)(?=\d+\,\d+$)', s).group(1)
# 'PEDMILANO OVE3ST- BINASCOA'

См. демо

  • \d+([A-Z].*?)(?=\d+\,\d+$)

    • \: соответствует символу: буквально (с учетом регистра)
    • \d+: соответствует di git (равно [0-9])
    • + Квантификатор - сопоставляет от одного до неограниченного количества раз, столько раз, сколько возможно, возвращая при необходимости (жадный)
    • 1-я группа захвата ([A-Z].*?) Соответствует одному символу, присутствующему в списке ниже [A-Z]
      • A-Z один символ в диапазоне между A (индекс 65) и Z (индекс 90) (с учетом регистра)
      • .*? соответствует любому символу (кроме ограничителей строки)
      • *? Quantifier - Сопоставляет от нуля до неограниченного количества раз, насколько это возможно, расширяясь по мере необходимости (ленивый)
    • Позитивный прогноз (? = \ D + \, \ d + $) Утверждают, что приведенное ниже регулярное выражение соответствует
      • \d+ соответствует di git (равно [0-9])
      • + Квантор - соответствует b между одним и неограниченным количеством раз, столько раз, сколько возможно, возвращая по мере необходимости (жадный) \, соответствует символу, буквально (с учетом регистра)
    • \d+ соответствует разности git (равно [0-9])
    • + Квантор - сопоставляет от одного до неограниченного числа раз, сколько возможно, возвращая при необходимости (жадный)
    • $ утверждает позицию в конце строки
0 голосов
/ 31 марта 2020

Другой способ go,

result = re.search(r"\d(?=[A-Za-z])(.*?)\d,", string).group(1)

Выход print(result):

# string = "8-02-202010:44:48PEDMILANO OVE3ST- BINASCOA1,40"
PEDMILANO OVE3ST- BINASCOA

#string = "18-02-202010:44:48PEDMILANO OVEST- BINASCOA1,40"
PEDMILANO OVEST- BINASCOA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...