正则表达式匹配复杂字符串

时间:2021-05-07 14:29:04

标签: python regex string

我有以下示例字符串:

- 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'),这完全不是我所需要的。

1 个答案:

答案 0 :(得分:1)

看起来您正在寻找这个正则表达式:

(\w+?)(?:_(L[1-8]|FCV|[A-H])|([1-8]))?$

匹配最少数量的单词字符 (\w+?) 后跟 enum_ 部分和 L1-L8FCV 或 {{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))