我有以下示例字符串:
- FCF_VD_ID,
- [FCF_VD_Alert_L1, ..., FCF_VD_Alert_L8],
- FCF_VD_SyncID,
- [FCF_VRU_Alert_FCV, FCF_VRU_Alert_A ..., FCF_VRU_Alert_H],
- [COM_Cam_Frame_1, ..., COM_Cam_Frame_8]
我需要从这些字符串中提取一些特定的部分。具体来说,我需要每个字符串的核心名称,在上述情况下,它就是枚举器之前的所有内容。 作为枚举器,我处理 L1->L8、FCV、A->H、1->8。
作为输出,我需要得到两个字符串:
core, enum = re.match(regex, string)
示例:
FCF_Alert_L1 -> FCF_Alert, L1
FCF_SyncID -> FCF_Sync_ID, None
FCF_VRU_Alert_FCV -> FCF_VRU_Alert, FCV
不幸的是,我的正则表达式 ^([A-Za-z_]+(ID)?)([A-Z]+\d+|[A-Z]+|\d+)?$
不起作用。
有人能指出这个正则表达式的问题吗?
对于 FCF_VD_ID_L1
,我收到了 ('FCF_VD_ID_L', None, '1')
,这完全不是我所需要的。
答案 0 :(得分:1)
看起来您正在寻找这个正则表达式:
(\w+?)(?:_(L[1-8]|FCV|[A-H])|([1-8]))?$
匹配最少数量的单词字符 (\w+?
) 后跟 enum
的 _
部分和 L1-L8
、FCV
或 {{1} } 或 A-H
范围内的数字。
请注意,由于您使用的是 1-8
,因此开头不需要 re.match
,因为 ^
将所有匹配项锚定到字符串的开头。
在蟒蛇中:
re.match
输出:
import re
strs = [
'FCF_VD_ID', 'FCF_VD_Alert_L1', 'FCF_VD_Alert_L8',
'FCF_VD_SyncID', 'FCF_VRU_Alert_FCV', 'FCF_VRU_Alert_A',
'FCF_VRU_Alert_H', 'COM_Cam_Frame_1', 'COM_Cam_Frame_8',
'idObject1'
]
regex = '(\w+?)(?:_(L[1-8]|FCV|[A-H])|([1-8]))?$'
for s in strs:
core, enum1, enum2 = re.match(regex, s).groups()
enum = enum1 if enum1 else enum2
print(s + ' => ', (core, enum))