簡體   English   中英

Python 正則表達式 map 多對一

[英]Python regex map multiple matches to one

如果字符串包含例如“狗”、“貓”或“鳥”,我希望正則表達式返回“動物”。

我可以使用以下方法輕松找到它們: 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 文件,包含用於多個設備及其不同固件版本的數百條命令)。 進行匹配的庫代碼采用正則表達式和命令響應並返回匹配數據(如果有)。

庫代碼現在是通用的,可以處理任何類型的響應,但它不能將多個匹配字符串“映射”到一個值,因此我的問題是。 如果我可以用“魔法正則表達式”解決我的問題,那么我就不必碰圖書館了。 如果那不可能,我將不得不尋找不同的解決方案,可能會更改庫代碼。

如果這是一個難題,並且您真的想要一個re.search聲明:

import regex

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

re僅允許在標准 Python 中進行固定寬度的lookbehind,因此您必須使用regex (這是 Python 的稍微強大的通用正則表達式引擎。

之所以可行,是因為您只需將'animal'添加到主題中,並且僅匹配字符串末尾的那個詞,如果它前面有任何動物詞。

但是,由於它們的長度不同,因此re不會。

如果這不是一個難題,那么您最好:

import re

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM