Spaces:
Sleeping
Sleeping
| import re | |
| from typing import List, Dict, Optional | |
| class InvoiceParser: | |
| def __init__(self): | |
| # Define basic regex patterns for MVP | |
| self.patterns = { | |
| 'invoice_number': r'(?i)invoice\s*(?:no|number|#)?\s*[:\-]\s*([a-zA-Z0-9\-]+)', | |
| 'date': r'(?i)date\s*[:\-]?\s*(\d{1,2}[/\-]\d{1,2}[/\-]\d{2,4}|\d{4}[/\-]\d{1,2}[/\-]\d{1,2})', | |
| 'total_amount': r'(?i)total\s*(?:amount)?\s*[:\-]?\s*(?:usd|rp|\$)?\s*([\d,\.]+)' | |
| } | |
| def parse(self, texts: List[str]) -> Dict[str, Optional[str]]: | |
| result = { | |
| 'invoice_number': None, | |
| 'date': None, | |
| 'total_amount': None | |
| } | |
| # We will iterate through texts and try to match our patterns | |
| for text in texts: | |
| for field, pattern in self.patterns.items(): | |
| if result[field] is None: # Only get the first match for simplicity | |
| match = re.search(pattern, text) | |
| if match: | |
| result[field] = match.group(1).strip() | |
| # Clean up total amount | |
| if result['total_amount']: | |
| # Replace commas and keep decimal point if necessary, or just extract the number | |
| cleaned = re.sub(r'[^\d\.]', '', result['total_amount']) | |
| result['total_amount'] = cleaned | |
| return result | |