在 Python 中用冒号分割字符串

Posted

技术标签:

【中文标题】在 Python 中用冒号分割字符串【英文标题】:Splitting string by colon in Python 【发布时间】:2020-11-18 01:53:54 【问题描述】:

我有一个提醒应用程序,我需要像3:30 a.m. 那样分配时间。我使用了re 模块,但失败了。

我要做的是在列表中的单词前面用冒号分隔时间。但是列表有多个单词。喜欢a.m.am

程序应该尝试单词直到找到正确的匹配项,并用冒号分隔时间,例如小时和分钟。 13:25[13, 25]

这是一个例子:

import re

am = ['a.m.', 'am', 'ante meridiem']
timeinp = 'reminder for 3:30 am'

for a in am:
    gettime = re.search(fr'\b\d?\d:\d\d\b a', timeinp).group(0)
    gettime = re.split('[:]', gettime)
    print(gettime)

这段代码给了我AttributeError: 'NoneType' object has no attribute 'group'

【问题讨论】:

【参考方案1】:

如果有匹配项,您可以使用带有捕获组的单个正则表达式来立即访问小时和分钟:

import re

am = ['a.m.', 'am', 'ante meridiem']
timeinp = 'reminder for 3:30 am'

a = "|".join(map(re.escape, am))
gettime = re.search(fr'\b(\d1,2):(\d2)\s*(?:a)', timeinp)
if gettime:
    print(list(map(int, gettime.groups()))) # => [3, 30]
else:
    print("no match")

见Python demo

请注意,gettime.groups() 包含一个 元组,其中包含匹配的所有子组,从 1 到模式中的任何组。 捕获组是模式的所有部分(...).

您需要 re.escape 您的 am 列出项目,否则,. 匹配任何字符。您需要在字符类之外使用\. 来匹配文字点。

【讨论】:

Wiktor,您可以通过转义括号来修复正则表达式字符串。想知道你为什么决定删除它或使用另一个正则表达式 本身没有任何“错误”。我正在评论您删除的原始帖子并决定恢复到正则表达式的 OP 版本。由于 f 修饰符,\d1,2 被评估为“(1,2)” @user120242 这没什么区别。恢复为使用1,22 @WiktorStribiżew 如何匹配re 类似1.5.5 @June \d+(?:\.\d+)?【参考方案2】:

正如其他人所指出的那样,如果存储在 am 中的项目导致循环中不匹配,您将得到一个 AttributeError,因为 re.search() 返回 None

以下示例在处理re.search()返回None的情况下与其他示例类似,但是它:

在模式中使用前瞻,以便在返回的匹配项中不包含 am 项。 进一步将匹配处理为 2 个 int 实例的列表,而不是 str 实例。 打破print(gettime) 之后的循环以停止任何 进一步迭代并保持分配给gettime的列表值 循环执行后可用。 包含一些基本逻辑,用于打印No time match found! 消息,以解决循环退出但未根据您的条件匹配的情况。
import re

am = ['a.m.', 'am', 'ante meridiem']
timeinp = 'reminder for 3:30 am'
gettime = None

for a in am:
     gettime = re.search(fr'\b\d?\d:\d\d\b(?= a)', timeinp)
     if gettime:
            gettime = [ int(i) for i in re.split(':', gettime.group()) ]
            print(gettime)
            break
            
if not gettime:
    print('No time match found!')

【讨论】:

以上是关于在 Python 中用冒号分割字符串的主要内容,如果未能解决你的问题,请参考以下文章

用空格和冒号分割字符串,但如果在引号内则不分割

在MYSQL中用空格分割字符串

如何在 Java 中用逗号和换行符 (\n) 分割字符串? [复制]

Lua中用Split函数分割字符串

正则表达式以python分割文本文件

SQLSERVER中计算某个字段中用分隔符分割的字符的个数