鱼C论坛

 找回密码
 立即注册
查看: 102|回复: 3

[技术交流] 正则表达式匹配字符串的问题

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
执行路径下有如下字符串,uvm_scratch_work_portlink_test_03_20_2025_13_57_45___RTL ,uvm_scratch_spd_lfb_03_20_2025_14_30_05___RTL, python负责匹配上述字符串。 代码如下:
#!/usr/bin/python3

import os
import re
import subprocess


without_mdl_module_name=['spd_lfb','work']
cur_dir = '.'
covered_dirs = []
cover_dir = "./coverage"

process=[]

cover_log = "**************This is collect coverage log file for ./scripts/collect_codecov.py****************\n"

def gen_without_mdl_vdb_file(path,name):
        for item in os.listdir(path):
                #print(item)
                if name in item:
                        pattern = r'uvm_scratch_[a-z]+[0-9]*(_[a-z]+){0,2}_\d+_\d+_\d+_\d+_\d+_\d+___RTL$'
                        #pattern = r'^uvm_scratch_{}.*?_\d+_\d+_\d+_\d+_\d+_\d+___RTL$'.format(re.escape(name))
                        match_pat = re.match(pattern,item)
                        print('match_pat:',match_pat)
                       

for name in without_mdl_module_name:
        print('Collect code coverage without mdl module:',name)
        gen_without_mdl_vdb_file(cur_dir,name)


运行上述代码, 输出结果为:
Collect code coverage without mdl module: spd_lfb
match_pat: <_sre.SRE_Match object; span=(0, 45), match='uvm_scratch_spd_lfb_03_20_2025_14_30_05___RTL'>
Collect code coverage without mdl module: work
match_pat: <_sre.SRE_Match object; span=(0, 56), match='uvm_scratch_work_portlink_test_03_20_2025_13_57_4>


为什么对字符串 uvm_scratch_work_portlink_test_03_20_2025_13_57_45___RTL 匹配结果为  match='uvm_scratch_work_portlink_test_03_20_2025_13_57_4  ? 没有匹配全是怎么回事?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
你的正则表达式 `r'uvm_scratch_+*(_+){0,2}_\d+_\d+_\d+_\d+_\d+_\d+___RTL$'` 存在一些问题,导致 `re.match()` 无法正确匹配目标字符串。以下是几个关键问题:

1. `[+*]` 组合在一起是无效的,`+` 和 `*` 不能连用。
2. `(_+){0,2}` 这个部分的逻辑不清晰,可能不是你想要的匹配方式。
3. `re.match()` 只会从字符串的开头进行匹配,而 `name` 可能出现在 `uvm_scratch_` 之后的某个位置,导致匹配失败。

### **修正后的正则表达式**
你可以尝试以下正则表达式:
pattern = r'^uvm_scratch_[a-zA-Z0-9_]+_\d{2}_\d{2}_\d{4}_\d{2}_\d{2}_\d{2}___RTL$'

### **代码修正**
import os
import re

def gen_without_mdl_vdb_file(path, name):
    for item in os.listdir(path):
        if name in item:
            pattern = r'^uvm_scratch_[a-zA-Z0-9_]+_\d{2}_\d{2}_\d{4}_\d{2}_\d{2}_\d{2}___RTL$'
            match_pat = re.match(pattern, item)
            print('match_pat:', match_pat)

without_mdl_module_name = ["spd_lfb", "work"]
cur_dir = '.'

for name in without_mdl_module_name:
    print('Collect code coverage without mdl module:', name)
    gen_without_mdl_vdb_file(cur_dir, name)

### **解释修正点**
1. `[a-zA-Z0-9_]+` 允许 `uvm_scratch_` 后面跟任意字母、数字和下划线的组合。
2. `\d{2}_\d{2}_\d{4}_\d{2}_\d{2}_\d{2}` 确保匹配 `03_20_2025_13_57_45` 这种日期时间格式。
3. `re.match()` 仍然适用,因为 `uvm_scratch_` 是字符串的开头。

这样修改后,你的代码应该可以正确匹配 `uvm_scratch_work_portlink_test_03_20_2025_13_57_45___RTL` 和 `uvm_scratch_spd_lfb_03_20_2025_14_30_05___RTL` 了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
FishC 发表于 2025-3-25 14:37
你的正则表达式 `r'uvm_scratch_+*(_+){0,2}_\d+_\d+_\d+_\d+_\d+_\d+___RTL$'` 存在一些问题,导致 `re.ma ...

使用上述代码, 输出结果还是  match_pat: <_sre.SRE_Match object; span=(0, 56), match='uvm_scratch_work_portlink_test_03_20_2025_13_57_4                                    
对字符串`uvm_scratch_work_portlink_test_03_20_2025_13_57_45___RTL`  无法匹配完整
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
鬼少 发表于 2025-03-25 15:00
FishC 发表于 2025-3-25 14:37
你的正则表达式 `r'uv ...


你的正则表达式仍然存在问题,导致 `re.match()` 无法正确匹配目标字符串。以下是修正方案:

### **问题分析**
1. `+` 号后面不能直接跟 `*`,这在正则表达式中是无效的。
2. `(_+){0,2}` 这个部分的逻辑不清晰,可能不是你想要的匹配方式。
3. `re.match()` 只会从字符串的开头进行匹配,而 `name` 可能出现在 `uvm_scratch_` 之后的某个位置,导致匹配失败。
4. 你的 `pattern` 可能没有正确匹配 `uvm_scratch_` 后面的模块名称。

### **修正后的正则表达式**
pattern = r'^uvm_scratch_[a-zA-Z0-9_]+_\d{2}_\d{2}_\d{4}_\d{2}_\d{2}_\d{2}___RTL$'
**解释:**
- `^uvm_scratch_`:确保字符串以 `uvm_scratch_` 开头。
- `[a-zA-Z0-9_]+`:匹配模块名称(如 `work_portlink_test` 或 `spd_lfb`)。
- `\d{2}_\d{2}_\d{4}_\d{2}_\d{2}_\d{2}`:匹配日期时间格式 `03_20_2025_13_57_45`。
- `___RTL$`:确保字符串以 `___RTL` 结尾。

### **修正后的代码**
import os
import re

def gen_without_mdl_vdb_file(path, name):
    for item in os.listdir(path):
        if name in item:
            pattern = r'^uvm_scratch_[a-zA-Z0-9_]+_\d{2}_\d{2}_\d{4}_\d{2}_\d{2}_\d{2}___RTL$'
            match_pat = re.match(pattern, item)
            print(f'Checking: {item}')
            print('match_pat:', match_pat)

without_mdl_module_name = ["spd_lfb", "work"]
cur_dir = '.'

for name in without_mdl_module_name:
    print('Collect code coverage without mdl module:', name)
    gen_without_mdl_vdb_file(cur_dir, name)

### **进一步调试**
如果仍然匹配不到,可以尝试:
1. **打印 `item`**:确保 `os.listdir(path)` 返回的文件名是正确的。
2. **使用 `re.search()` 代替 `re.match()`**:
match_pat = re.search(pattern, item)
   `re.search()` 可以匹配字符串的任意位置,而 `re.match()` 只匹配开头。

请尝试上述修改,并检查输出是否符合预期!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-3-31 08:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表