如何用Python正则表达式提取带格式的数字(如时间13:30)?
正则表达式解析与问题解决
正则表达式r'\d+(?::\d+)?'的含义
把这个表达式拆成两部分拆解:
\d+:匹配1个或多个连续数字,像8、13、30这类数字串都能被这部分命中。(?::\d+)?:这是一个可选匹配项:::匹配冒号本身;\d+:同样匹配1个或多个连续数字;- 整个
(?::\d+)被?修饰,表示这一段(冒号+数字串)可以出现0次或者1次。
合起来,这个表达式的作用就是:匹配一串数字,这串数字后面可以选择性地跟着一个冒号加另一串数字。
能否匹配单独数字8?
完全可以。因为(?::\d+)?是可选的,当遇到单独的8时,表达式的\d+部分会直接匹配到它,后面的可选部分不生效,所以8会被成功提取。
针对需求的正确代码示例
用这个正则表达式就能得到你想要的[8, "13:30"]结果:
import re text = "new notebook was sold 8 times before 13:30 in given shop" result = re.findall(r'\d+(?::\d+)?', text) # 若需要把单独数字转成整数,可做如下处理 processed_result = [int(item) if ':' not in item else item for item in result] print(processed_result) # 输出: [8, '13:30']
你之前尝试的正则的问题
- 第一个正则
[0-5][0-9]:只能匹配两位数字,且范围限定在00-59,会把13:30拆成13和30提取,同时漏掉单独的8。 - 第二个正则
\d+:会把所有连续数字串单独提取,不管冒号,因此把13:30拆成13和30,不符合保留时间格式的需求。
内容的提问来源于stack exchange,提问作者neural science
相关产品推荐
相关产品推荐

