【问题标题】:Regex doesn't filter out the right text on datatime正则表达式不会在日期时间过滤掉正确的文本
【发布时间】:2016-10-16 18:32:08
【问题描述】:

我在下面有一个字符串:

senton = "Sent:                               Friday, June 18, 2010 12:57 PM"

我创建了一个正则表达式来过滤掉日期时间部分:

reg_datetime = "(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4} \d{2}:\d{2} (AM|PM)"

我在 regex101.com 中测试了正则表达式,它按预期工作,但是,在我的 python 测试脚本中运行它时,它无法给我正确的文本,谁能帮我修复它?

以这种方式使用它:

real_senton = re.findall(reg_datetime, senton)
print real_senton

产生这个结果(here is the screenshot):

[('Friday', 'June', 'PM')]

非常感谢。

【问题讨论】:

  • 这个正则表达式工作得很好。你希望它做什么?

标签: python regex


【解决方案1】:

函数re.findall 执行以下操作:

返回字符串中所有不重叠的模式匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。空匹配包含在结果中,除非它们触及另一个匹配的开头。

因此,如果有组,它会返回组。 group 是括号中的正则表达式中的任何内容。

解决方案 1

要单独获取每个项目,请将所有内容放入 parentesis:

reg_datetime = "(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), "\
 "(January|February|March|April|May|June|July|August|September|October|November|December)"\
 " (\d{1,2}), (\d{4}) (\d{2}):(\d{2}) (AM|PM)"

然后re.findall(reg_datetime, senton)会返回:

[('Friday', 'June', '18', '2010', '12', '57', 'PM')]

解决方案 2

或者,将所有内容放在一个大组中:

reg_datetime = "((Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), "\
 "(January|February|March|April|May|June|July|August|September|October|November|December)"\
 " \d{1,2}, \d{4} \d{2}:\d{2} (AM|PM))"

现在大组也返回了:

[('Friday, June 18, 2010 12:57 PM', 'Friday', 'June', 'PM')]

解决方案 3

或者将现有的 grop 更改为非捕获组(语法 (?:...)

reg_datetime = "(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), "\
 "(?:January|February|March|April|May|June|July|August|September|October|November|December)"\
 " \d{1,2}, \d{4} \d{2}:\d{2} (?:AM|PM)"

结果:

['Friday, June 18, 2010 12:57 PM']

解决方案 4

或者根本不使用findall。使用re.search。它返回一个Match 对象,为您提供更多选择。原来的reg_datetime 是这样工作的:

>>> m = re.search(reg_datetime, senton)
>>> m.group(0)
'Friday, June 18, 2010 12:57 PM'
>>> m.group(1)
'Friday'
>>> m.group(2)
'June'
>>> m.group(3)
'PM'

【讨论】:

  • 非常感谢,我会采取解决方案3,但其他人肯定对我有很大启发。
【解决方案2】:

不改变reg_datetime,只使用search

import re
senton = "Sent:                               Friday, June 18, 2010 12:57 PM"
reg_datetime = "(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}, \d{4} \d{2}:\d{2} (AM|PM)"
l = re.search(reg_datetime,senton,re.M|re.I)
print l.group()

然后运行:

$ python file.py
Friday, June 18, 2010 12:57 PM
$

【讨论】:

  • 非常感谢
【解决方案3】:

如果您希望正则表达式返回所有这些值,您必须确保它们位于不同的组中,如下所示:

reg_datetime = "(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (January|February|March|April|May|June|July|August|September|October|November|December) (\d{1,2}), (\d{4}) (\d{2}):(\d{2}) (AM|PM)"

【讨论】:

    【解决方案4】:

    问题是返回给你的匹配结果是'('')'之间的匹配结果,称为组匹配。 因此,您的正则表达式应如下所示返回所有数据:

    reg_datetime = "(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (January|February|March|April|May|June|July|August|September|October|November|December) (\d{1,2}), (\d{4}) (\d{2}:\d{2}) (AM|PM)"
    

    您可以看到here 演示。或者,如果您想要一个字符串中的所有日期,只需在 '(' ')' 之间添加所有正则表达式

    【讨论】:

    • 非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2019-02-26
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多