结合正则表达式和已知的字符串

时间:2018-04-16 05:27:43

标签: regex python-3.x

这是我目前的代码:

exp1 = re.compile('((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4})')   

但我想要实现的是这样的:

regMonth = '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)'
exp1 = re.compile(r'(regMonth'+ r'\s?\d{4})') 

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

你可以尝试:

regMonth = 'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec'
pattern = r'(?i)(?:' + regMonth + r')\s?\d{4}'

像这样:

regMonth = 'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec'

string_1 = 'Jan 1947, dec 3456'

pattern = r'(?i)(?:' + regMonth + r')\s?\d{4}'

y = re.findall(pattern, string_1)

如果您在这种情况下打印y,则会获得:

['Jan 1947', 'dec 3456']

这是匹配日期的数组。 string_1是输入字符串,其中包含所需格式的日期。

说明 -

首先,您可以将pattern解释为:

pattern = r'(?i)(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s?\d{4}'

其中:

(?i) - Indicates that the regex is case-insensitive (If you want the user to enter the Month with the first letter being in caps, then remove this)
(?:  - Is a non-capturing group containing the month (followed by 'regMonth')

注意 - 您还必须将第二个字符串')\s?\d{4}'作为原始字符串,否则整个事情就会搞砸了。

此外,非捕获组非常重要,否则正则表达式将匹配Jan,“2月”,...,NovDec\s?\d{4}。 因此,Dec\s?\d{4}成为一个完全独立的选项,这是不可取的。