我陷入了正则表达式操作。我正在尝试编写一个可选表达式来查找字符串中的日期
我有三个字符串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 : []
任何帮助将不胜感激。感谢
答案 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)