正则表达式回溯得到第一个字

时间:2018-12-05 22:35:40

标签: python regex regex-lookarounds

我正在寻找使用正则表达式从日期值取回第一个单词。没有确切的单词模式,但我只是想获取日期之前的第一个单词(而不是整个字符串)。

我到目前为止有什么:

regexDate = r'.*(?=)[w]*\d{2}\/\d{2}\/\d{4}|.*(?=)[a-zA-Z]+\s[0-9][0-9],?\s[0-9][0-9][0-9][0-9]|.*(?=)\d{2}-\d{2}-\d{4}|\d{2}/\w*/\d{4}|.*(?=)\d{2}-\w*-\d{4}|.*(?=)\d{2}.\w*.\d{4}|.*(?=)\d{4}/\d{2}/\d{2}|.*(?=)\d{2}-\w*-\d{2}|.*(?=)\d{2}/\d{2}/\d{2}'

text = 'blah blah Start: 01-Oct-2018 blah blah End: 30-Sep-2019'

find =  re.findall(regexDate, text)

结果:

['blah blah Start: 01-Oct-2018 blah blah End: 30-Sep-2019']

在这种情况下,我只是想获取“开始:2018年10月1日”和“结束:2019年9月30日”。

注意:在其他情况下,“开始”和“结束”可能是一组不同的单词。日期格式也不同。

我确实尝试将.*(?=)包装在各种可能性周围,但它将只返回2019年9月30日。也许有人也可以建议一个更干净的版本?

4 个答案:

答案 0 :(得分:1)

这似乎可以做到:

re.findall(r'\b\S+\s+\d\d?-[A-Za-z]{3}-\d{4}\b', text)

返回:

['Start: 01-Oct-2018', 'End: 30-Sep-2019']

开头的\b强制以单词开头(分词),然后是一串非空格和一个或多个空格,然后是日期表达式。

答案 1 :(得分:0)

我想您正在寻找类似的东西? (?i)start:\s*(?<start>\d\d-\w+-\d{4}).*end:\s*(?<end>\d\d-\w+-\d{4})

Demo

答案 2 :(得分:0)

最新答案,但这是一种解决方法:

[^ ]+: [^ ]+

import re
text = 'blah blah Start: 01-Oct-2018 blah blah End: 30-Sep-2019'
result = re.findall("[^ ]+: [^ ]+", text)
# ['Start: 01-Oct-2018', 'End: 30-Sep-2019']

答案 3 :(得分:0)

使用此正则表达式匹配所有类型的月份(数字或缩写):

import re

regex = r"(\S+\s*\d{2}-\w+-\d{4})"

test_str = "blah blah Start: 01-Oct-2018 blah blah End: 30-Sep-2019"
# test_str = "test test Start:01-06-2018 blah blah End: 30-08-2019"

match = re.findall(regex,test_str)
print(match)
# ['Start: 01-Oct-2018', 'End: 30-Sep-2019']