匹配首字母缩写词与他们的长格式 - python

尝试将首字母缩写词与其含义进行匹配-首字母缩写词和含义都在同一文档中,并且通常彼此之间相距不远。

例如,此文本示例:

  
    (b)代表紧接生效时间之前发行和发行的每股代表两股A类股份的美国存托股份(如果有的话,代表除外股份的ADS除外)将被注销,以换取有权收取每份ADS现金12.25美元(不计利息)(“每份ADS合并对价”)(减去每份ADS取消费用0.05美元),并应按照存款协议中规定的条款和条件进行支付,以及每股A类股份以此类美国存托凭证为代表的股份,应予注销,并不再存在,以换取保存人作为其注册持有人收取每股合并对价的权利,保存人将以每股美国存托凭证向每股美国存托股份的持有人分配根据本协议和存款协议中的条款和条件进行的合并对价(每次美国存托凭证注销费用减去0.05美元);前提是,如果本协议与存款协议发生任何冲突,则以本协议为准;
  

首字母缩写词是“ ADS”,其含义是“ American Depositary Share”。

我开始基于令牌化首字母缩略词构建正则表达式-因此它看起来像这样的"[A].+?[D].+?[S].+?\b",并且适用于上面的示例,但是我正在寻找一种更“ python-y”的方式,因为我看到的首字母缩写类型。

例子:

1)根据本协议中规定的条款和条件,并根据开曼群岛公司法(2018年修订)(“ CICL”),将与CLCI匹配,但与CICL不匹配

2)公司SEC报告中包含或通过引用并入的每份合并财务报表(包括每种情况下的任何附注)均根据美国公认会计准则(“ GAAP”)编制-资本与小写并希望添加美国。

参考方案

有几种正则表达式格式可以匹配这些确切的规范,它们是根据文本中现有的缩写词动态创建的。问题在于,尝试匹配开曼群岛《公司法》(2018年修订版)之类的CICL等多种格式意味着正则表达式应在公司,法律,开曼群岛和离岛之间寻找扩展词,并且它必须是通用的,因为一个例子扩展版本的一个可能是地区和州收购的财政和财政部,您永远不知道是什么情况。因此,如果我要搜索MFTRSA,并且我有一个短语,例如m other问f ather t o r aise s ome a wareness,那么显然这将是一个匹配项

在脚本末尾,您将获得类似以下内容的信息:
{'ADS': ('American Depositary Share', 9)}显示了用来检测长文本,长版本和长文本起始索引的缩写。您还将获得无与伦比的首字母缩写词。

from collections import defaultdict
from itertools import permutations
import re

ACRONYM_PATTERN = "[A-Z]{2,}"

text = "in the Ministry of Noodles (cooked 1808) and External Amicalities ordonance 46 has been ratified because the Chief Hunter Gatherer also known as CHG found a SGC in the Left Chamber (LC) in the second part of the trimestrial chicken fight. the CHG also aclaimed that the members of the MNEA are no longer fit to eat noodles because the LC's color had turned into green. Long live the queen and may the MNEA get morphed into a duck!"


# detect all acronyms in the text
detected_acronyms = re.finditer(ACRONYM_PATTERN, text)
detected_acronyms_indexes = defaultdict(list)

for a in detected_acronyms:
    detected_acronyms_indexes[a.group()].append(a.start())

acronyms_set = set(detected_acronyms_indexes.keys())

x = []

# create regex patterns for all acronyms
acronyms_patterns = defaultdict(list)
for acronym in acronyms_set:
    # uppercase strict pattern
    words = "".join([r"[{}]\w+ ".format(c) for c in acronym])
    pattern = "{}".format(words)
    acronyms_patterns[acronym].append(pattern.strip())

    # uppercase extended pattern
    words = []
    acronym_len = len(acronym)
    for i, c in enumerate(acronym):
        word = r"[{}]\w+ ".format(c)
        if i + 1 < acronym_len:
            word += "(?:[a-zA-Z0-9\(\)]+ ){0,3}"
        words.append(word)

    pattern = "{}".format("".join(words))
    acronyms_patterns[acronym].append(pattern.strip())

    # lowercase strict
    words = "".join([r"[{}]\w+ ".format(c) for c in acronym.lower()])
    pattern = "{}".format(words)
    acronyms_patterns[acronym].append(pattern.strip())

    # lowercase extended pattern
    words = []
    acronym_len = len(acronym)
    for i, c in enumerate(acronym.lower()):
        word = r"[{}]\w+ ".format(c)
        if i + 1 < acronym_len:
            word += "(?:[a-zA-Z0-9\(\)]+ ){0,3}"
        words.append("".join(word))

    pattern = "{}".format("".join(words))
    acronyms_patterns[acronym].append(pattern.strip())

# use the patterns to detect the longer versions in the text
original_text_indexes = {}
for acronym, patterns_list in acronyms_patterns.items():
    for pattern in patterns_list:
        result = re.search(pattern.replace("\\\\", "\\"), text)

        if result is None:
            continue

        original_text_indexes[acronym] = (result.group(), result.start())

print("Detected long versions")
print(original_text_indexes)

print("\nUnmatched acronyms")
print(acronyms_set.difference(set(original_text_indexes.keys())))

Python:在不更改段落顺序的情况下在文件的每个段落中反向单词? - python

我想通过反转text_in.txt文件中的单词来生成text_out.txt文件,如下所示:text_in.txt具有两段,如下所示:Hello world, I am Here. I am eighteen years old. text_out.txt应该是这样的:Here. am I world, Hello old. years eighteen a…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

如何在python中将从PDF提取的文本格式化为json - python

我已经使用pyPDF2提取了一些文本格式的发票PDF。我想将此文本文件转换为仅包含重要关键字和令牌的json文件。输出应该是这样的:#PurchaseOrder {"doctype":"PO", "orderingcompany":"Demo Company", "su…

查找字符串中的行数 - python

我正在创建一个python电影播放器​​/制作器,我想在多行字符串中找到行数。我想知道是否有任何内置函数或可以编写代码的函数来做到这一点:x = """ line1 line2 """ getLines(x) python大神给出的解决方案 如果换行符是'\n',则nlines …

我怎样才能从字典的键中算出对象? - python

我有这本字典:dict={"asset":[("S3","A1"),"S2",("E4","E5"),("E1","S1"),"A6","A8"], "…