>

이 정규식을 사용하고 싶습니다

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

    이것은 원하는 것입니다. 정규 표현식은 정확하지만 검색 한 후에 일치해야합니다.

     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 객체를 반환합니다.  실패하면 해당 개체에는 일치하는 정규식에 대한 모든 정보가 포함됩니다. 전체 경기를하려면 Match.group ()이라고 부릅니다.

  • 답변 # 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']
    
    
    이 경우 모든 일치 항목 (일치 개체가 아닌 문자열)이 포함 된 목록이 반환됩니다. 다시 한 번 캡처 그룹을 사용하면 각 튜플에 일치하는 모든 그룹이 포함 된 튜플 목록이 반환됩니다.

    방법에 대해 읽으십시오-re.search and re.findall

  • 답변 # 3

    이 단순한 표현은 여기서 효과가있을 것입니다.

    (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)))
    
    
    데모

  • 답변 # 4

    \W  아마도 모든 것을 Kredit에 일치시킬 것입니다 ...

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

    Summe 이후 처음 50,90과 일치해야합니다.

    분리 쉼표가 너무 구체적이면 (점으로 표시 될 수 있으므로) 문자 세트를 사용할 수 있습니다.

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

관련 자료

  • 이전 android - 프래그먼트 내부의 Kotlin 버튼 onClickListener 이벤트
  • 다음 c# - Windows Azure Table Storage의 모든 행을 쿼리하는 방법은 무엇입니까?