python正则表达式
正则表达式是一种用于匹配字符串模式的工具。在 Python 中,re
库提供了正则表达式的支持。
1. 常用元字符
.
:匹配任意单个字符(除了换行符)。^
:匹配字符串的开头。$
:匹配字符串的结尾。*
:*匹配前面的字符 0 次或多次。+
:匹配前面的字符 1 次或多次。?
:匹配前面的字符 0 次或 1 次。{n}
:匹配前面的字符恰好 n 次。{n,}
:匹配前面的字符至少 n 次。{n,m}
:匹配前面的字符至少 n 次,最多 m 次。
2. 字符类
[ ]
:匹配方括号内的任意一个字符。- 例如:
[abc]
匹配a
、b
或c
。 [a-z]
匹配任意小写字母。[0-9]
匹配任意数字。
- 例如:
[^ ]
:取反,匹配不在方括号内的任意字符。
3. 特殊字符类
\d
:匹配任意数字,等价于[0-9]
。\D
:匹配任意非数字,等价于[^0-9]
。\w
:匹配任意字母、数字或下划线,等价于[a-zA-Z0-9_]
。\W
:匹配任意非字母、数字或下划线,等价于[^a-zA-Z0-9_]
。\s
:匹配任意空白字符(空格、制表符、换行符等)。\S
:匹配任意非空白字符。
4. 分组和引用
( )
:将括号内的内容作为一个分组,可以用于提取子匹配或应用量词。\1
,\2
, …:引用前面的分组。
二、Python re
库的基本用法
re
库提供了多个核心函数,最常用的有:
1. re.search(pattern, string)
- 作用:在字符串中搜索第一个匹配的模式。
- 返回值:如果找到匹配,返回
Match
对象;否则返回None
。
示例:
import retext = "Hello, World!"
match = re.search(r"World", text)
if match:print("找到匹配:", match.group()) # 输出: 找到匹配: World
2. re.match(pattern, string)
- 作用:从字符串的开头开始匹配模式。
- 返回值:如果开头匹配,返回
Match
对象;否则返回None
。
示例:
match = re.match(r"Hello", text) # 匹配成功
match = re.match(r"World", text) # 匹配失败(不是从开头匹配)
3. re.findall(pattern, string)
- 作用:查找字符串中所有匹配的模式。
- 返回值:返回包含所有匹配的列表。
示例:
text = "apple, banana, cherry"
matches = re.findall(r"\w+", text)
print(matches) # 输出: ['apple', 'banana', 'cherry']
4. re.sub(pattern, repl, string)
- 作用:替换字符串中所有匹配的模式。
- 返回值:返回替换后的新字符串。
示例:
text = "Hello, World!"
new_text = re.sub(r"World", "Python", text)
print(new_text) # 输出: Hello, Python!
3. 实战问题解决
问题描述:
我有一个answer,里面的内容是一段推理的字符串。例如:
answer = “1. 观察图片,找到.............。
在押人员中,穿红色马甲的人位于最前面。2. 检查在押人员后面是否有任何人,有就输出“false”,没有人就输出“true”。在押人员后面有穿黑色衣服的特保。3. 输出格式为:最终结果是 true 或 false。最终结果是 false。<|im_end|>”
我想判断推理的最终结果,判断是True 还是 false, 但是文字中会有T 、F干扰。所以下面这种简单的方式 ×
pred = 1 if "true" in answer.lower() else 0
y_true.append(label)
y_pred.append(pred)
要用正确的正则表达式求解。
解决思路:
直接匹配之后的一句话“r"最终结果是\s*(\w+)\s*。<\|im_end\|>$"
”
r""
: 转义 把里面的内容的符号都转义为正常的符号。 r代表:trope。
#使用正则表达式import repattern = r"最终结果是\s*(\w+)\s*。<\|im_end\|>$"match = re.search(pattern, answer)if match:result_text = match.group(1)pred = 1 if result_text.lower() == "true" else 0else:print(f"未能从图片{image_path}的答案中提取结果: {answer}")pred = 0
正则表达式的匹配模式解释:
-
r"最终结果是\s*(\w+)\s*。<\|im_end\|>$"
\s*
:匹配零个或多个空白字符。(\w+)
:捕获一个或多个字母、数字或下划线(即true
或false
)。。<\|im_end\|>$
:匹配结尾的"。<|im_end|>"
。
五、正则表达式调试技巧
如果正则表达式不按预期工作,可以使用以下方法调试:
-
在线工具:推荐使用 regex101.com 测试和可视化正则表达式。
-
打印匹配结果:
match = re.search(pattern, answer) if match:print("完整匹配:", match.group(0))print("分组1:", match.group(1)) else:print("未找到匹配")
总结
通过正则表达式,你可以更灵活地从模型输出中提取结果。关键是理解:
- 正则表达式的基本语法(元字符、字符类、分组)。
re.search()
用于查找匹配。- 使用
group()
方法提取捕获的内容。