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

2024-09-27 04:25:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下示例字符串:

- 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

不幸的是,我的regex^([A-Za-z_]+(ID)?)([A-Z]+\d+|[A-Z]+|\d+)?$不起作用。 有人能指出这个正则表达式中的问题吗? 对于FCF_VD_ID_L1,我收到了('FCF_VD_ID_L', None, '1'),这完全不是我所需要的


Tags: 字符串gtcomidl1alertframeregex
1条回答
网友
1楼 · 发布于 2024-09-27 04:25:30

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

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

它匹配最少数量的单词字符(\w+?),后跟_L1-L8FCVA-Henum部分,或1-8范围内的数字

注意:由于您使用的是re.match,因此开头不需要^,因为re.match将所有匹配项锚定到字符串的开头

在python中:

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))

输出:

FCF_VD_ID =>  ('FCF_VD_ID', None)
FCF_VD_Alert_L1 =>  ('FCF_VD_Alert', 'L1')
FCF_VD_Alert_L8 =>  ('FCF_VD_Alert', 'L8')
FCF_VD_SyncID =>  ('FCF_VD_SyncID', None)
FCF_VRU_Alert_FCV =>  ('FCF_VRU_Alert', 'FCV')
FCF_VRU_Alert_A =>  ('FCF_VRU_Alert', 'A')
FCF_VRU_Alert_H =>  ('FCF_VRU_Alert', 'H')
COM_Cam_Frame_1 =>  ('COM_Cam_Frame', '1')
COM_Cam_Frame_8 =>  ('COM_Cam_Frame', '8')
idObject1 =>  ('idObject', '1')

相关问题 更多 >

    热门问题