正则表达式匹配字符串的问题
执行路径下有如下字符串,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_+*(_+){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? 没有匹配全是怎么回事? 你的正则表达式 `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_+_\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_+_\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. `+` 允许 `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 小助理,如未能正确解答您的问题,请继续追问。 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`无法匹配完整 鬼少 发表于 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_+_\d{2}_\d{2}_\d{4}_\d{2}_\d{2}_\d{2}___RTL$'
**解释:**
- `^uvm_scratch_`:确保字符串以 `uvm_scratch_` 开头。
- `+`:匹配模块名称(如 `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_+_\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 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]