根据字母计数检索带括号的缩写的定义

Posted

技术标签:

【中文标题】根据字母计数检索带括号的缩写的定义【英文标题】:Retrieve definition for parenthesized abbreviation, based on letter count 【发布时间】:2019-10-18 02:14:59 【问题描述】:

我需要根据括号中的字母数检索首字母缩略词的定义。对于我正在处理的数据,括号中的字母数对应于要检索的单词数。我知道这不是获取缩写的可靠方法,但在我的情况下它会是。例如:

String = '虽然家族健康史 (FHH) 被普遍认为是常见慢性病的重要风险因素,但执业护士 (NP) 很少考虑到这一点。'

期望输出:家族健康史 (FHH)、执业护士 (NP)

我知道如何从字符串中提取括号,但之后我就卡住了。任何帮助表示赞赏。

 import re

 a = 'Although family health history (FHH) is commonly accepted as an 
 important risk factor for common, chronic diseases, it is rarely considered 
 by a nurse practitioner (NP).'

 x2 = re.findall('(\(.*?\))', a)

 for x in x2:
    length = len(x)
    print(x, length) 

【问题讨论】:

我认为除了可能使用正则表达式之外,您还需要在这里编写一些解析逻辑。 我知道我可以运行一个循环并执行一个 Len(string) 来获取字母的数量,但我想在那之后我迷路了。比如如果是 3 个字母,如何捕捉前 3 个单词。 你应该使用"""而不是'作为多行字符串 【参考方案1】:

一个想法,使用recursive pattern 和PyPI regex module。

\b[A-Za-z]+\s+(?R)?\(?[A-Z](?=[A-Z]*\))\)?

See this pcre demo at regex101

\b[A-Za-z]+\s+ 匹配 word boundary、one or more alpha、一个或多个 空白 (?R)? 递归部分:optionally 从头开始​​粘贴模式 \(? 需要使括号可选,以适应 \)? [A-Z](?=[A-Z]*\) 匹配一个上 alpha if followed by 关闭 ) 与任何 A-Z 之间
    不检查第一个单词字母是否与缩写中位置的字母实际匹配。 不检查缩写前面的左括号。要检查,请在后面添加一个可变长度的lookbehind。将[A-Z](?=[A-Z]*\)) 更改为(?<=\([A-Z]*)[A-Z](?=[A-Z]*\))

【讨论】:

【参考方案2】:

这个解决方案并不是特别聪明,它只是简单地搜索首字母缩略词,然后构建一个模式来提取每个单词前面的单词:

import re

string = "Although family health history (FHH) is commonly accepted as an important risk factor for common, chronic diseases, it is rarely considered by a nurse practitioner (NP)."

definitions = []

for acronym in re.findall(r'\(([A-Z]+?)\)', string):
    length = len(acronym)

    match = re.search(r'(?:\w+\W+)' + str(length) + r'\(' + acronym + r'\)', string)

    definitions.append(match.group(0))

print(", ".join(definitions))

输出

> python3 test.py
family health history (FHH), nurse practitioner (NP)
>

【讨论】:

【参考方案3】:

relist-comprehension 一起使用

x_lst = [ str(len(i[1:-1])) for i in re.findall('(\(.*?\))', a) ]

[re.search( r'(\S+\s+)' + i + '\(.' + i + '\)', a).group(0) for i in x_lst]
#['family health history (FHH)', 'nurse practitioner (NP)']

【讨论】:

【参考方案4】:

使用正则表达式匹配来查找匹配开始的位置。然后使用 python 字符串索引来获取导致匹配开始的子字符串。按单词拆分子字符串,并获取最后 n 个单词。其中n是缩写的长度。

import re
s = 'Although family health history (FHH) is commonly accepted as an important risk factor for common, chronic diseases, it is rarely considered by a nurse practitioner (NP).'


for match in re.finditer(r"\((.*?)\)", s):
    start_index = match.start()
    abbr = match.group(1)
    size = len(abbr)
    words = s[:start_index].split()[-size:]
    definition = " ".join(words)

    print(abbr, definition)

打印出来:

FHH family health history
NP nurse practitioner

【讨论】:

伙计,真是救命稻草。这就说得通了。非常感谢。 您可以将output = ""添加到代码顶部,将output += definition + ", (" + abbr + ")"添加到循环末尾以获得所需的输出。 我建议只匹配大写字母:re.finditer(r"\(([A-Z]*?)\)", s)【参考方案5】:

这能解决您的问题吗?

a = 'Although family health history (FHH) is commonly accepted as an important risk factor for common, chronic diseases, it is rarely considered by a nurse practitioner (NP).'
splitstr=a.replace('.','').split(' ')
output=''
for i,word in enumerate(splitstr):
    if '(' in word:
        w=word.replace('(','').replace(')','').replace('.','')
        for n in range(len(w)+1):
            output=splitstr[i-n]+' '+output

print(output)

事实上,Keatinge 打败了我

【讨论】:

以上是关于根据字母计数检索带括号的缩写的定义的主要内容,如果未能解决你的问题,请参考以下文章

根据字母的重复性来计数和打印字母

计数dp与容斥

Powershell根据给定的计数选择一个随机字母,并动态地将每个字母分配给一个唯一的变量?

MySQL括号字符串计数

根据对多关系中相关对象的计数对获取请求进行排序

如何检索“平均值”性能计数器?