可选的正则表达式操作

时间:2016-03-22 14:58:51

标签: python regex

我陷入了正则表达式操作。我正在尝试编写一个可选表达式来查找字符串中的日期

我有三个字符串a,b和c,如下所示

a = '(sam was born on 11 Oct 1990)'
b = 'sam was born on Oct 1990'
c = 'sam was born on 1990'

我想写一个表达式,以便

a I get output '11 Oct 1990'
b I get output 'Oct 1990'
c I get output '1990'

我能够为a和b获取正确的输出,但对于c我无法。但是,当我将c更改为

c = 'sam was born on  1990' -- with two spaces between on and 1990

我获取正确的输出。

我使用的正则表达式是:

print re.findall(r"((11)?[\s\(](((Nov|Oct))?([\s\(-]|,\s)(1990|1991)))", a)

我获取的输出是:

Output for a : [('11 Oct 1990', '11', 'Oct 1990', 'Oct', 'Oct', ' ', '1990')]
Ouptut for b : [(' Oct 1990', '', 'Oct 1990', 'Oct', 'Oct', ' ', '1990')]
Ouptut for c : []

任何帮助将不胜感激。感谢

5 个答案:

答案 0 :(得分:1)

您可以使用:

regex = re.compile(r'((?:11)?[\s\(](?:(?:(?:Nov|Oct))?(?:[\s\(?:-]|,\s)?(?:1990|1991)))')

它和你的一样,但是使用非捕获块,只有外部块捕获

答案 1 :(得分:0)

在日期之前您不需要\s。这为您提供了所需的输出。

print re.findall(r"((11)?[\s\(](((Nov|Oct))?([\s\(-]|)(1990|1991)))", c)

答案 2 :(得分:0)

另一种方法(可能更简单?):

on\s([^)\n]+)\)?$
# match on literally
# a whitespace
# followed by anything NOT a closing parenthesis or newline (save this to Group 1)
# followed by an optional parenthesis
# bind the Expression to the end of the line

这会考虑之前的on和所需匹配后的可选)。您需要使用multiline模式,请参阅working on regex101.com

答案 3 :(得分:0)

请查看是否有效:

str=re.findall(r'([\d]{0,2}\s*?[a-zA-Z]*?\s*[\d]{4}',a)

答案 4 :(得分:0)

我认为这是一个很好且明确的选择:

found = re.findall(r"(11\s)?(Nov\s|Oct\s)?(1990|1991)", a)

然后,如果您在字符串中有多个日期,则可以打印:

for date in found:
    print ''.join(date)