Python正则表达式将多个匹配项映射到一个

时间:2021-01-27 21:32:32

标签: python regex

如果字符串包含例如“狗”、“猫”或“鸟”,我希望正则表达式返回“动物”。

我可以使用以下方法轻松找到它们:re.search('(dog|cat|bird)', mystring)

但这会返回“狗”、“猫”或“鸟”,例如:

result = re.search('(dog|cat|bird)', 'a bag of birdseed')
print(result)
<_sre.SRE_Match object; span=(9, 13), match='bird'> 
print(result[0])
bird

是否可以制作一个正则表达式,为任何选项返回“动物”?
所以对于上面的例子:

result = re.search(magic_regex, 'a bag of birdseed')
print(result[0])
animal

我仅限于 re.search(现有的固定代码),我唯一的自由是正则表达式。

进行匹配的代码在一个库中(除非我真的需要,否则我不想更改)。库代码用于解析我们发送到嵌入式设备的(串行)命令的响应(使用正则表达式)。然后将响应映射或转换为人类可读的值并显示在基于 GUI 的配置工具中。用户可以编辑工具中的值并将其写回,而无需了解任何复杂的串行命令。

我们将每个设备的所有命令的正则表达式保存在一个数据库中(一组 .ini 文件,包含针对多个设备及其不同固件版本的数百个命令)。进行匹配的库代码接受正则表达式和命令的响应,并返回匹配的数据(如果有)。

库代码现在是通用的,可以处理任何类型的响应,但它不能将多个匹配的字符串“映射”到一个值,因此我的问题。 如果我可以用“神奇的正则表达式”解决我的问题,那么我就不必碰图书馆了。如果这是不可能的,我将不得不寻找不同的解决方案,可能会更改库代码。

1 个答案:

答案 0 :(得分:1)

如果这是一个谜题,而您真的想要一个 re.search 语句:

import regex

result = regex.search('(?<=.*(dog|cat|bird).*)animal$', 'a bag of birdseed' + 'animal')
print(result[0])

re 在标准 Python 中只允许固定宽度的后视,所以你必须使用 regex(这是一个稍微强大的 Python 通用正则表达式引擎。

之所以有效,是因为您只需将 'animal' 添加到主题中,并且仅匹配字符串末尾的该单词,前提是该单词前面有任何动物单词。

但是,由于它们的长度不同,re 不会。

如果这不是一个谜题,你最好:

import re

result = re.search('dog|cat|bird', 'a bag of birdseed')
if result:
    print('animal')