从连续字符串中仅选择正则表达式匹配

时间:2019-06-24 18:28:39

标签: python regex

我要使用此正则表达式

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 个答案:

答案 0 :(得分:2)

您缺少的是一种方便的方法来“抢”您的比赛。

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']

在这种情况下,将返回具有所有匹配项(已经是字符串,而不是Match对象)的列表。同样,如果您使用捕获组,则将返回一个元组列表,其中每个元组都包含匹配的所有组。

了解方法-re.searchre.findall

答案 1 :(得分:1)

我的猜测是,这种简单的表达可能会在这里起作用

(Summe.+?)•

测试

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)))

Demo

答案 2 :(得分:1)

这就是您想要的,您的正则表达式正确,但是您必须在搜索后找到匹配项。

  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成功时返回Match对象,失败时返回None,该对象包含有关您匹配的正则表达式的所有信息。要获得整个比赛,请致电Match.group()

答案 3 :(得分:1)

\W可能会匹配Kredit之前的所有内容...

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

应该与Summe之后的前50,90相匹配。

如果分隔逗号太具体(因为它可能以点表示),则可以使用字符集:

regex = r'Summe\d[,.]\d{2}'