正则匹配需求:提取studies/studiesUID后的带点序列号,排除seriesUID内容
正则匹配方案:提取studies/studyUID后的带点数字序列
问题核心
你需要匹配studies或studyUID之后、下一个非数字单词前的带多点数字序列,同时排除seriesUID后的同类序列。之前的正则失效,主要是两个细节错误:
[\.\d+]是字符集合,仅匹配单个.、数字或+,无法表达「数字+.+数字」的重复结构[^a-zA-Z0-9]*匹配范围过宽,不如精准匹配非数字字符的\D*合适
正确正则表达式
(?:studies|studyUID)\D*(\d+(?:\.\d+)+)
正则拆解
(?:studies|studyUID):非捕获组,匹配目标前缀studies或studyUID,不占用最终捕获结果\D*:匹配0个或多个非数字字符(比如冒号、引号、空格等分隔符),直到遇到数字序列(\d+(?:\.\d+)+):捕获组,精准匹配带点的数字序列\d+:匹配开头的一串数字(?:\.\d+)+:非捕获组,重复匹配「.+数字」的结构,确保序列是数字.数字.数字...的格式
使用示例(Python)
import re # 示例文本 raw_text = """ studies: 1.2.840.113619.2.248.116524556585.23765.1290700521734.13 studyUID="1.2.840.113619.2.248.116524556585.23765.1290700523548.1000" seriesUID: 1.2.3.4.5 """ # 编译正则并提取结果 pattern = re.compile(r'(?:studies|studyUID)\D*(\d+(?:\.\d+)+)') target_sequences = pattern.findall(raw_text) print(target_sequences) # 输出结果: # ['1.2.840.113619.2.248.116524556585.23765.1290700521734.13', '1.2.840.113619.2.248.116524556585.23765.1290700523548.1000']
这个正则会自动忽略seriesUID后的序列,只提取studies或studyUID对应的目标数字串。
内容的提问来源于stack exchange,提问作者catwin94
相关产品推荐
相关产品推荐

