Я хочу использовать это регулярное выражение

r"Summe\d+\W\d+"

Чтобы соответствовать этой строке

150,90‡50,90‡8,13‡Summe50,90•50,90•8,13•Kreditkartenzahlung

Но я хочу только отфильтровать эту конкретную часть

Summe50,90

Я могу выбрать всю строку с этим регулярным выражением, но я не уверен, как отфильтровать только соответствующую часть

Вот функция, в которой я пытаюсь получить сумму из PDF:

    def get_amount(url):
      data = requests.get(url)
      with open('/Users/derricdonehoo/code/derric-d/price-processor/exmpl.pdf', 'wb') as f:
        f.write(data.content)

      pdfFileObj = open('exmpl.pdf', 'rb')
      pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

      pageObj = pdfReader.getPage(0)
      text = pageObj.extractText().split()

      regex = re.compile(r"Summe\d+\W\d+")

      matches = list(filter(regex.search, text))
      for i in range(len(matches)):
        matchString = '\n'.join(matches)


      print(matchString)

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

Благодарность!!

1
derric-d 24 Июн 2019 в 21:28

4 ответа

Лучший ответ

Это то, что вы хотите, ваше регулярное выражение верно, но вы должны получить совпадение после его поиска.

  regex = re.compile(r"Summe\d+\W\d+")
  text = ["150,90‡50,90‡8,13‡Summe50,90•50,90•8,13•Kreditkartenzahlung"]

  matches = []
  for t in text:
    m = regex.search(t)
    if m:
      matches.append(m.group(0))

  print(matches)

re.search возвращает Соответствует объекту при успехе, None при ошибке, и этот объект содержит все информация о вашем подходящем регулярном выражении. Чтобы получить полное совпадение, вы вызываете Match.group () .

1
SilvanoCerza 24 Июн 2019 в 19:06

\W, вероятно, будет соответствовать всему, вплоть до Kredit ...

regex = r'Summe\d+,\d{2}'

Должен соответствовать первым 50,90 после Summe.

Если разделительная запятая слишком конкретна (потому что она может быть точкой), вы можете использовать набор символов:

regex = r'Summe\d[,.]\d{2}'
1
Tomerikoo 24 Июн 2019 в 19:56

То, что вам не хватает, это удобный способ «схватить» ваш матч.

import re

text = "150,90‡50,90‡8,13‡Summe50,90•50,90•8,13•Kreditkartenzahlung"
match = re.search("Summe\d+\W\d+", text)
if match:
    res = match.group()

>>> print(res)
'Summe50,90'

Обратите внимание, что group принимает индекс для возврата группы из вашего регулярного выражения, но так как он не использует группы (которые в вашем регулярном выражении окружены (...)), вы просто называете его так.


Если вы хотите найти все вхождения указанного шаблона, используйте re.findall:

import re

text = "150,90‡50,90‡8,13‡Summe50,90•50,90•Summe8,13•Kreditkartenzahlung"
matchs = re.findall("Summe\d+\W\d+", text)

>>> print(matches)
['Summe50,90', 'Summe8,13']

В этом случае будет возвращен список со всеми соответствиями (уже строки, а не объекты соответствия). Опять же, если вы используете группы захвата, будет возвращен список кортежей, где каждый кортеж содержит все группы для совпадения.

Прочтите о методах - re.search и re.findall

2
Tomerikoo 24 Июн 2019 в 19:24