如何从字符串任意位置提取int类型变量名?替代startswith方案
问题原因与解决方案
问题根源
是,问题完全由startswith函数导致。startswith仅检查字符串开头是否匹配"int",完全忽略字符串中间出现的"int",自然无法提取这类场景下的变量名。
替代方案
方案1:使用字符串find循环查找
通过find方法遍历字符串中所有"int"的出现位置,再提取后续到list_end的内容:
list_variable = [] # 替换为你的实际结束标识,比如空格、分号、括号等 list_end = " " # 替换为你的输入字符串列表 input_strings = [ "int zt", "void func(int w)", "int nu; return 0;", "int i, int i2", "getScoreOrder(int getScoreOrder)", "getInteger(int getInteger)", "int i int t", "int z int g", "int z getType(int getType)", "int y", "int i int k" ] for s in input_strings: # 查找第一个"int"的位置 int_pos = s.find("int") while int_pos != -1: # 计算变量名的起始位置(跳过"int") var_start = int_pos + len("int") # 从变量起始位置开始找结束标识 end_pos = s.find(list_end, var_start) # 如果找到结束标识,提取变量名(去除前后空白) if end_pos != -1: var_name = s[var_start:end_pos].strip() if var_name: list_variable.append(var_name) # 继续查找下一个"int"的位置 int_pos = s.find("int", int_pos + 1) print(list_variable)
方案2:使用正则表达式(更灵活)
正则表达式可以更精准匹配"int"后的变量名,尤其适合复杂格式的字符串:
import re list_variable = [] # 定义结束标识的正则匹配规则,比如空格、分号、逗号、括号等 end_pattern = r'[\s;(),]' # 构建匹配规则:匹配int后任意空白,再捕获变量名,直到遇到结束标识 match_pattern = re.compile(r'int\s*(\w+)(?=' + end_pattern + ')') input_strings = [ "int zt", "void func(int w)", "int nu; return 0;", "int i, int i2", "getScoreOrder(int getScoreOrder)", "getInteger(int getInteger)", "int i int t", "int z int g", "int z getType(int getType)", "int y", "int i int k" ] for s in input_strings: # 提取所有匹配的变量名 vars_found = match_pattern.findall(s) list_variable.extend(vars_found) print(list_variable)
注意事项
- 需根据实际的
list_end标识调整代码:如果结束标识是特定字符串(比如";"),直接替换list_end或正则中的end_pattern即可。 - 若变量名包含特殊字符(如下划线以外的符号),需调整正则的
\w部分,比如改为[a-zA-Z0-9_]+或更符合需求的规则。
内容的提问来源于stack exchange,提问作者ya xi er
相关产品推荐
相关产品推荐

