如何用Python正则表达式匹配subprocess获取的SVN列表字符串?
Python正则匹配SVN目录列表的实现方案
首先咱们得先把subprocess拿到的输出处理成方便操作的格式,毕竟原始输出是一串带换行的字符串。先看基础的处理代码:
import os, subprocess import re # 执行SVN命令获取输出 args = "svn ls https://svne1.access.nsn.com/isource/svnroot/scm_fp/trunk" pi = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) stdout, stderr = pi.communicate() # 处理输出:Python3需要先解码字节串为字符串,然后分割成行,过滤空行 # Python2直接用stdout.splitlines()就行 svn_items = [line.strip() for line in stdout.decode('utf-8').splitlines() if line.strip()]
接下来根据你可能的需求,提供几种常用的正则匹配方案:
1. 基础匹配与版本号提取
如果只是要确认每个条目符合R_FPT_xxx/的格式,或者想把版本号单独提取出来,可以用这两个正则:
# 匹配完整的目录条目(包含末尾的斜杠) full_item_pattern = re.compile(r'^R_FPT_\S+/') # 提取版本号部分(去掉前缀R_FPT_和末尾的斜杠) version_extract_pattern = re.compile(r'^R_FPT_(\S+)/') matched_entries = [] extracted_versions = [] for item in svn_items: # 先校验条目格式 if full_item_pattern.match(item): matched_entries.append(item) # 再提取版本号 version_match = version_extract_pattern.match(item) if version_match: extracted_versions.append(version_match.group(1)) print("匹配到的完整条目:", matched_entries) print("提取出的版本号:", extracted_versions)
2. 精准匹配特定格式的版本
如果你需要筛选特定规则的版本(比如只找190开头的,或者严格的多段数字版本),可以针对性写正则:
示例1:筛选以190开头的版本
# 匹配R_FPT_190.xxx/格式的条目 v190_pattern = re.compile(r'^R_FPT_190\.\S+/') v190_entries = [item for item in svn_items if v190_pattern.match(item)] print("190开头的版本条目:", v190_entries)
示例2:筛选多段数字组成的版本(比如x.x.x.x这种结构)
# 匹配由数字和点组成的版本格式 multi_segment_pattern = re.compile(r'^R_FPT_(\d+\.)+\d+/') multi_segment_entries = [item for item in svn_items if multi_segment_pattern.match(item)] print("多段数字版本的条目:", multi_segment_entries)
3. 批量提取所有匹配内容
如果不想先分割成行,也可以直接对整个输出字符串做匹配,一次性拿到所有结果:
stdout_str = stdout.decode('utf-8') # 一次性提取所有版本号 all_versions = re.findall(r'R_FPT_(\S+)/', stdout_str) print("一次性提取的所有版本号:", all_versions)
小提示
- Python2环境下不需要
decode('utf-8'),直接用stdout字符串就行。 - 如果版本号里只会有数字和点,把正则里的
\S换成[\d.]+会更严谨,避免匹配到意外字符。 - 如果需要更严格的版本校验(比如固定3段或4段数字),可以把正则改成
^R_FPT_\d+\.\d+\.\d+/这类更具体的格式。
内容的提问来源于stack exchange,提问作者SinghB
相关产品推荐
相关产品推荐

