Выберите только регулярное выражение из непрерывной строки - PullRequest
2 голосов
/ 24 июня 2019

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

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)

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

спасибо !!

Ответы [ 4 ]

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

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

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

1 голос
/ 24 июня 2019

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

  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 голос
/ 24 июня 2019

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

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

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

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

regex = r'Summe\d[,.]\d{2}'
1 голос
/ 24 июня 2019

Я предполагаю, что это простое выражение, скорее всего, сработает здесь,

(Summe.+?)•

Test

import re

regex = r"(Summe.+?)•"

test_str = "150,90‡50,90‡8,13‡Summe50,90•50,90•8,13•Kreditkartenzahlung"

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

Демо

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