【发布时间】:2020-12-17 06:00:08
【问题描述】:
我正在寻找与以下字符串匹配的正则表达式模式:
一些示例文本 (SET) 展示了我正在寻找的内容。能源系统模型 (ESM) 用于寻找特定的最优值 (SCO)。有人说计算机系统 (CUST) 很酷。夏天在外面玩(OUTS)应该是首选。
我的目标是匹配以下内容:
Some example text (SET)
Energy system models (ESM)
specific optima (SCO)
computer systems (CUST)
outside (OUTS)
重要的是,它并不总是正好是三个单词和它们的第一个字母。有时用于缩写的字母仅包含在前面的单词中。这就是我开始研究positive lookbehind 的原因。但是,它受到长度的限制,可以通过将其与positive lookahead 组合来解决。到目前为止,我还没有想出一个可靠的解决方案。
到目前为止我所做的尝试:
(\b[\w -]+?)\((([A-Z])(?<=(?=.*?\3))(?:[A-Z]){1,4})\)
这很有效,但匹配包含的单词太多:
Some example text (SET)
Energy system models (ESM)
are used to find specific optima (SCO)
Some say Computer systems (CUST)
In the summer playing outside (OUTS)
我还尝试在第一组的开头使用对缩写首字母的引用。但这根本不起作用。
我看过但没有发现有用的东西:
有用的资源:
【问题讨论】:
-
括号之间的大写字符连接到它前面的单词没有逻辑吗?
-
试试
[x.group() for x in re.finditer(r'\b([A-Z])\w*(?:\s+\w+)*?\s*\(\1[A-Z]*\)', text)](regex demo) -
@Thefourthbird 逻辑是它事先如何缩写单词,因此大写字符必须包含在其中。
-
啊,一定是
[x.group() for x in re.finditer(r'\b([A-Z])\w*(?:\s+\w+)*?\s*\(\1[A-Z]*\)', text, re.I)](Python demo)。我不确定是否只检查第一个单词的首字母是否适合 OP。 @david,够不够好,还是你认为一定有更复杂的逻辑? -
@WiktorStribiżew 这似乎不太正确,因为缩写应该全部大写。否则,可能会出现误报,例如:
Stupid example(s)。
标签: python regex regex-lookarounds