多部分正则表达式:精确和非精确短语的混合

2024-05-15 03:58:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一些化学命名实体从语料库构建一个ML训练数据集

我提到化学背景的原因只是为了确保这是一个现实的例子,而不是一个虚构的例子

为此,我需要一个具有以下结构的正则表达式:

1-以化学式字符串“2h-四氮唑,2,2'-(3,3'-二甲氧基[1,1'-联苯]-4,4'-二酰基)双[3-(4-硝基苯基)-5-苯基-,氯化物(1:2)”开头
2-后跟0至15个字符
3-后跟化学代码字符串“298-83-9”
4-后跟0至15个字符
5-后跟非字母数字字符
6-后跟字符串“5”
7-以非字母数字值结束

我添加非字母数字要求#5和#7的原因是,要执行正则表达式搜索的文本是一个长而杂乱的文本,我想确保字符串“5”不是另一个实体的一部分,例如这两个示例:“bluh bluh 298-83-9 bluh bluh 564”或“bluh bluh 298-83-9 bluh bluh 645”

我的做法是建立一种如下的表达方式:

reg_exp = name_entity[0] + r".{0,15}\s*" + name_entity[1] + r".{0,15}\s*" + r"[^a-zA-Z\d]+" + name_entity[2] + r"[^a-zA-Z\d]+"

其中name_entity是包含要求1、3和6中的字符串的数组

然而,问题是需求1和3中的化学公式和代码有太多的转义、连字符等,以致于我的表达式不起作用。我需要一种方法来提示正则表达式,让它认为name_实体元素被视为完全是字面短语,而不包含一些正则表达式

如果这很重要,我将用Python编写代码

非常感谢您的帮助。在这里,我复制了多页长文本的一部分,该文本旨在包含正则表达式要查找的内容。我的python代码re.findall(reg_exp,text)应该查找的部分以粗体显示:

“成分物质/混合物的成分/信息:混合物物质名称:nbt/bcip储备溶液,mbf成分化学名称cas-no.浓度(%w/w)甲烷,1,1'-亚砜基-67-68-5>;=50-<;702h四氮唑,2,2'-(3,3'-二甲氧基[1,1'-联苯]-4,4'-二烷基)双[3-(4-硝基苯基)-5-苯基-,氯化物(1:2)”298-83-9>;=1-<;5实际浓度作为商业秘密被扣留第4节。急救措施一般建议:不要让受害者无人看管。安全数据表nbt/bcip储备溶液版本3.0修订日期:2019年9月25日”


Tags: 字符串代码name文本实体字母原因数字
1条回答
网友
1楼 · 发布于 2024-05-15 03:58:52

这里有一些问题,但它适用于以下代码:

def new_regex(entity):
    return fr"{re.escape(entity[0])}.{{0,15}}\s*{re.escape(entity[1])}.{{0,15}}\s*[^a-zA-Z\d]+{re.escape(entity[2])}[^a-zA-Z\d]+"


entity = [
    "2h-tetrazolium, 2,2'-(3,3'- dimethoxy[1,1'-biphenyl]-4,4'- diyl)bis[3-(4-nitrophenyl)-5-phenyl-, chloride (1:2)",
    '298-83-9',
    '5'
]

n = "composition/information on ingredients substance / mixture : mixture substance name : nbt/bcip stock solution, mbf components chemical name cas-no. concentration (% w/w) methane, 1,1'-sulfinylbis- 67-68-5 >= 50 - < 70 2h-tetrazolium, 2,2'-(3,3'- dimethoxy[1,1'-biphenyl]-4,4'- diyl)bis[3-(4-nitrophenyl)-5-phenyl-, chloride (1:2) 298-83-9 >= 1 - < 5 actual concentration is withheld as a trade secret section 4. first aid measures general advice : do not leave the victim unattended. safety data sheet nbt/bcip stock solution version 3.0 revision date: 09-25-2019"

regex = new_regex(entity)
regex.findall(n)

#  ["2h-tetrazolium, 2,2'-(3,3'- dimethoxy[1,1'-biphenyl]-4,4'- diyl)bis[3-(4-nitrophenyl)-5-phenyl-, chloride (1:2) 298-83-9 >= 1 - < 5 "]

这是通过使用re.escape修复的,并且修复了化学公式中的一些空白问题。不过,您可能希望更改实体以更好地处理空白

相关问题 更多 >

    热门问题