次のpythonコードがあります
from io import BytesIO
import pdfplumber, requests
test_case = {
'https://www1.hkexnews.hk/listedco/listconews/sehk/2020/0514/2020051400555.pdf': 59,
'https://www1.hkexnews.hk/listedco/listconews/gem/2020/0529/2020052902118.pdf': 55,
'https://www1.hkexnews.hk/listedco/listconews/sehk/2020/0618/2020061800366.pdf': 47,
'https://www1.hkexnews.hk/listedco/listconews/gem/2020/0630/2020063002674.pdf': 30,
}
for url, page in test_case.items():
rq = requests.get(url)
pdf = pdfplumber.load(BytesIO(rq.content))
txt = pdf.pages[page].extract_text()
txt = re.sub("([^\x00-\x7F])+", "", txt) # no chinese
pattern = r'.*\n.*?(?P<auditor>[A-Z].+?\n?)(?:LLP\s*)?\s*((PRC.*?|Chinese.*?)?[Cc]ertified [Pp]ublic|[Cc]hartered) [Aa]ccountants'
try:
auditor = re.search(pattern, txt, flags=re.MULTILINE).group('auditor').strip()
print(repr(auditor))
except AttributeError:
print(txt)
print('============')
print(url)
次の結果が生成されます
'ShineWing'
'ShineWing'
'Hong Kong Standards on Auditing (HKSAs) issued by the Hong Kong Institute of'
'Hong Kong Financial Reporting Standards issued by the Hong Kong Institute of'
望ましい結果は次のとおりです。
'ShineWing'
'ShineWing'
'Ernst & Young'
'Elite Partners CPA Limited'
私は試した:
pattern = r'.*\n.*?(?P<auditor>[A-Z].+?\n?)$(?!Institute)(?:LLP\s*)?\s*((PRC.*?|Chinese.*?)?[Cc]ertified [Pp]ublic|[Cc]hartered) [Aa]ccountants'
このパターンは最後の 2 つのケースをキャプチャしますが、最初の 2 つのケースはキャプチャしません。
pattern = r'.*\n.*?(?P<auditor>^(?!Hong|Kong)[A-Z].+?\n?)(?:LLP\s*)?\s*((PRC.*?|Chinese.*?)?[Cc]ertified [Pp]ublic|[Cc]hartered) [Aa]ccountants'
これにより、望ましい結果が^(?!Hong|Kong)
得られますが、将来的に他の望ましい結果が無視される可能性があるため、リスクが高くなる可能性があるため、適切な候補ではありません。
代わりに、$(?!Institute)
より一般的で適切ですが、最初の 2 つのケースで一致しなかった理由がわかりません。次を含む一致を無視できる方法があれば素晴らしいと思いますissued by the Hong Kong Institute of
任意の提案をいただければ幸いです。ありがとうございました。