正则判断提取

Posted by Shallow Dreameron July 4, 2024

为了处理不同的格式,我们可以使用稍微复杂一点的正则表达式来分别匹配 thrufextnext 的不同模式。以下是更新后的 Python 脚本,能够根据指定格式匹配并提取信息:

import re

def match_and_extract_info(filename):
    # 定义正则表达式模式
    pattern_thru = re.compile(
        r'\[thru_([^_]+)_(up|down)\]_.*\.s\*p'
    )
    pattern_fext_next = re.compile(
        r'\[(fext|next)_v_([^_]+)_a_([^_]+)_(up|down)\]\.s\*p'
    )
    
    # 尝试匹配 thru 格式
    match_thru = pattern_thru.match(filename)
    if match_thru:
        return {
            'type': 'thru',
            'identifier': match_thru.group(1),
            'direction': match_thru.group(2),
            'valid': True
        }

    # 尝试匹配 fext 和 next 格式
    match_fext_next = pattern_fext_next.match(filename)
    if match_fext_next:
        return {
            'type': match_fext_next.group(1),
            'identifier_v': match_fext_next.group(2),
            'identifier_a': match_fext_next.group(3),
            'direction': match_fext_next.group(4),
            'valid': True
        }

    return {
        'valid': False
    }

# 测试字符串
test_strings = [
    '[thru_rx1_up]_xxx.s*p',
    '[fext_v_v1_a_a1_up].s*p',
    '[next_v_v1_a_a1_up].s*p',
    '[thru_test]_test.s*p',
    '[invalid]_test.s*p',
    '[next_v_rx2_a_a2_down].s*p',
    '[fext_v_a1_a2_up].s*p',
    '[thru_abcd_up]_xxx.s*p',
    '[fext_v_xyz_a_abc_down].s*p'
]

# 运行测试
for s in test_strings:
    result = match_and_extract_info(s)
    print(f"{s}: {result}")

解释

  1. 正则表达式
    • pattern_thru
      • r'\[thru_([^_]+)_(up|down)\]_.*\.s\*p'
        • \[thru_:匹配 [thru_
        • ([^_]+):匹配一个或多个非下划线字符的标识符。
        • _(up|down)\]:匹配 _up]_down]
        • _.*\.s\*p:匹配 _ 后面任意字符,接着是 .s 后面任意字符,并以 p 结尾。
    • pattern_fext_next
      • r'\[(fext|next)_v_([^_]+)_a_([^_]+)_(up|down)\]\.s\*p'
        • \[(fext|next)_v_:匹配 [fext_v_[next_v_
        • ([^_]+):匹配一个或多个非下划线字符的标识符。
        • _a_([^_]+):匹配 _a_ 后面跟一个或多个非下划线字符的标识符。
        • _(up|down)\]:匹配 _up]_down]
        • \.s\*p:匹配 .s 后面任意字符,并以 p 结尾。
  2. 匹配和提取
    • match_thru = pattern_thru.match(filename):尝试匹配 thru 格式。
    • match_fext_next = pattern_fext_next.match(filename):尝试匹配 fextnext 格式。

输出示例

[thru_rx1_up]_xxx.s*p: {'type': 'thru', 'identifier': 'rx1', 'direction': 'up', 'valid': True}
[fext_v_v1_a_a1_up].s*p: {'type': 'fext', 'identifier_v': 'v1', 'identifier_a': 'a1', 'direction': 'up', 'valid': True}
[next_v_v1_a_a1_up].s*p: {'type': 'next', 'identifier_v': 'v1', 'identifier_a': 'a1', 'direction': 'up', 'valid': True}
[thru_test]_test.s*p: {'type': 'thru', 'identifier': 'test', 'direction': 'up', 'valid': True}
[invalid]_test.s*p: {'valid': False}
[next_v_rx2_a_a2_down].s*p: {'type': 'next', 'identifier_v': 'rx2', 'identifier_a': 'a2', 'direction': 'down', 'valid': True}
[fext_v_a1_a2_up].s*p: {'type': 'fext', 'identifier_v': 'a1', 'identifier_a': 'a2', 'direction': 'up', 'valid': True}
[thru_abcd_up]_xxx.s*p: {'type': 'thru', 'identifier': 'abcd', 'direction': 'up', 'valid': True}
[fext_v_xyz_a_abc_down].s*p: {'type': 'fext', 'identifier_v': 'xyz', 'identifier_a': 'abc', 'direction': 'down', 'valid': True}

这个脚本将匹配并提取符合指定模式的字符串中的信息,并判断字符串是否符合要求,支持 thrufextnext 格式。


如果你需要在选择时将 v-model 中的数据绑定到 file_name,但最终使用 file_uid,可以通过额外的逻辑来实现。由于 file_uid 可能重复,你可以使用一个映射对象来保存 file_namefile_uid 的映射。

以下是一个示例:

假设你的数据结构是这样的:

data() {
  return {
    files: [
      { file_uid: '1', file_name: 'File 1' },
      { file_uid: '2', file_name: 'File 2' },
      { file_uid: '1', file_name: 'File 3' } // 重复的 file_uid
    ],
    selectedFileNames: [],
    fileUidMap: {}
  }
},
created() {
  this.buildFileUidMap();
},
methods: {
  buildFileUidMap() {
    this.files.forEach(file => {
      this.fileUidMap[file.file_name] = file.file_uid;
    });
  },
  getSelectedFileUids() {
    return this.selectedFileNames.map(fileName => this.fileUidMap[fileName]);
  }
}

在模板中,可以这样使用 el-checkbox

<template>
  <div>
    <el-checkbox-group v-model="selectedFileNames">
      <el-checkbox 
        v-for="file in files" 
        :key="file.file_name" 
        :label="file.file_name">
        
      </el-checkbox>
    </el-checkbox-group>
    <button @click="showSelectedFileUids">Show Selected File UIDs</button>
  </div>
</template>

在 methods 中添加一个方法来获取选中的 file_uid

methods: {
  buildFileUidMap() {
    this.files.forEach(file => {
      this.fileUidMap[file.file_name] = file.file_uid;
    });
  },
  getSelectedFileUids() {
    return this.selectedFileNames.map(fileName => this.fileUidMap[fileName]);
  },
  showSelectedFileUids() {
    const selectedUids = this.getSelectedFileUids();
    console.log(selectedUids); // 或者在这里执行你需要的操作
  }
}

在这个示例中:

  • v-model 绑定的是 selectedFileNames,这是一个数组,用于存储选中的 file_name
  • el-checkbox:label 属性绑定的是 file.file_name,这样选中的值将是 file_name
  • created 生命周期钩子中调用 buildFileUidMap 方法来构建 file_namefile_uid 的映射。
  • getSelectedFileUids 方法将 selectedFileNames 转换为对应的 file_uid
  • showSelectedFileUids 方法可以用来显示或使用选中的 file_uid

这样你就可以在选择时使用 file_name,并在需要时获取对应的 file_uid