Python的正则表达式万能匹配符 (.*?) 失效的情况和解决办法
正则表达式的万能匹配符 (.*?)
很好用,但有时会失效。本文将探讨这种情况以及解决办法。
问题描述
当处理以下字符串时:
s = '写入:name=miko, id=77286, pid=003-641, uuid=54afea8710ace146, time=1714812841346'
我尝试使用正则表达式提取 id
、pid
、uuid
和 time
的值:
import re
id = re.search('id=(.*?)', s)[1]
pid = re.search('pid=(.*?)', s)[1]
uuid = re.search('uuid=(.*?)', s)[1]
timestamp = re.search('time=(.*?)', s)[1]
print(id, pid, uuid, timestamp)
然而,上述代码的运行结果为空。
究其原因,是因为 (.*?)
匹配的是非贪婪模式,但如果后面没有明确的结束标记,它可能匹配到空字符串。
解决办法
方法一:使用明确的结束标记
由于 id
、pid
、uuid
等字段后面都有逗号,可以在正则表达式中加上逗号:
id = re.search('id=(.*?),', s)[1]
pid = re.search('pid=(.*?),', s)[1]
uuid = re.search('uuid=(.*?),', s)[1]
print(id, pid, uuid)
# 输出:77286 003-641 54afea8710ace146
方法二:使用字符集排除法
可以使用字符集排除法,即匹配任何不包含空格和逗号的连续字符序列:
id = re.search(r'id=([^\s,]+)', s)[1]
pid = re.search(r'pid=([^\s,]+)', s)[1]
uuid = re.search(r'uuid=([^\s,]+)', s)[1]
print(id, pid, uuid)
# 输出:77286 003-641 54afea8710ace146
解释:
[^\s,]+
匹配任何不包含空格和逗号的连续字符序列。[^ ]
:方括号表示一个字符集合,这里表示匹配方括号内的任何一个字符。^
:插入符号在方括号内表示取反,即不包含方括号内列出的字符。\s
:表示任何空白字符,包括空格、制表符、换行符等。,
:逗号字符本身。
获取 time
后面的数字
上面很好地解决了匹配 id、pid、uuid后面的字符串问题,因为它们都有明确的逗号作为分隔符,而对于获取 time
后面的数字,没有明显的分隔符,怎么办?下面有几种解决方式:
方法一:匹配到字符串结尾
timestamp = re.search(r'time=(.*?)$', s)[1]
# $ 表示匹配到结尾
print(timestamp)
# 输出:1714812841346
方法二:匹配数字
timestamp = re.search(r'time=(\d+)', s)[1]
# 匹配数字
print(timestamp)
# 输出:1714812841346
方法三:使用字符集排除法
timestamp = re.search(r'time=([^\s,]+)', s)[1]
# 匹配不含空格和逗号的连续字符序列
print(timestamp)
# 输出:1714812841346
原文地址:https://blog.csdn.net/Scott0902/article/details/139195576
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!