Python Timestring正则表达式:请简化它,并说明如何删除冒号?
我已经编写了一个正则表达式来解析系统日期和时间,我可以用这个脚本捕获所有内容(我知道有一些模块可以解析日期,这只是为了学习正则表达式) 目标: 获取组中所有单个元素的步骤 问题:Python Timestring正则表达式:请简化它,并说明如何删除冒号?,python,regex,Python,Regex,我已经编写了一个正则表达式来解析系统日期和时间,我可以用这个脚本捕获所有内容(我知道有一些模块可以解析日期,这只是为了学习正则表达式) 目标: 获取组中所有单个元素的步骤 问题: 如何使正则表达式更简单(如果有任何方法) 我怎么能简单地从正则表达式中删除冒号(就像我根本不想被捕获一样) 以下是我的输出: Sun Oct 14 13:47:03 CEST 2012 Sun Oct 14 13 : 47 : 03 CEST 2012 解决方案:只要不在匹配冒
Sun Oct 14 13:47:03 CEST 2012
Sun
Oct
14
13
:
47
:
03
CEST
2012
解决方案:只要不在匹配冒号的组周围加括号,它们就不会显示为捕获组:
>>> x = r"([A-Za-z]+\b)\s([A-Za-z]+\b)\s(\d\d)\s(\d\d)[/:](\d\d)[/:](\d\d)\s([A-Za-z]+\b)\s(\d\d\d\d)"
>>> re.search(x,s).groups()
('Sun', 'Oct', '14', '13', '47', '03', 'CEST', '2012')
但是如果你真的想简化这个大正则表达式,看起来你可以简单地在空格或冒号上拆分正则表达式,完全避免使用大正则表达式:
>>> re.split(r'[ :/]', s)
['Sun', 'Oct', '14', '13', '47', '03', 'CEST', '2012']
如果在语句周围加上括号,它将成为一个“捕获组”。
要防止出现这种情况,请不要放置括号,或创建非捕获组:
(?:[a-z]*)
然而,我的解决办法是:
([A-Za-z]+)\s([A-Za-z]+)\s(\d\d)\s(\d\d)[/:](\d\d)[/:](\d\d)\s([A-Za-z]+)\s(\d{4})
注意,我删除了单词边界,因为它们是不相关的,因为它们前面的条件只是字母表,后面跟一个空格字符
我还取消了冒号的包装,并在最后一条语句中指定了位数,使用
{4}
我确信python已经有了解析日期的库。“没有必要用正则表达式重新发明它们。”我知道,但我正在努力学习正则表达式并练习。你能帮忙吗?@Fenomatik like Hunter说,用time&date函数解析,然后用你喜欢的任何字符串格式写出来,会更容易、更易于维护。你真的还想写一个原始正则表达式,只是为了学习正则表达式吗?我不想:被捕获
-那你为什么明确要求捕获它呢?@smci,你认为用解析日期和时间来学习正则表达式是个坏主意吗?另外,你可以试试这个([a-Za-z]+)\s([a-Za-z]+)(?:\s(\d\d)){2}([/:](\d\d)){2}\s([A-Za-z]+\s(\d{4})
,但我不知道它是否能正确地将它分成几个组。我试着简单地说,你认为它现在看起来更好了?x=r“(\s+\b)\s(\s+\b)\s(\d{2})\s(\d{2})[/:](\d{2})[/:](\d{2})\s(\s+\b})s(\d{4})”它更简单,但在那里更容易得到不好的数据,像是非字符的意思♥.没有办法简单地避免它?(不将其添加到正则表达式,甚至不编写非捕获组)
([A-Za-z]+)\s([A-Za-z]+)\s(\d\d)\s(\d\d)[/:](\d\d)[/:](\d\d)\s([A-Za-z]+)\s(\d{4})