根据字母计数检索带括号的缩写的定义
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】:将re
与list-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 打败了我
【讨论】:
以上是关于根据字母计数检索带括号的缩写的定义的主要内容,如果未能解决你的问题,请参考以下文章