[英]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.